我正在创建一个存储库,如下所示:
public class StagingRepository
{
private IRepository<CurrentTransformer> CurrentTransformerRepository { get; set; }
private IRepository<Equipment> EquipmentRepository { get; set; }
private IRepository<Line> LineRepository { get; set; }
public StagingRepository()
{
this.CurrentTransformerRepository = new Repository<CurrentTransformer>();
this.EquipmentRepository = new Repository<Equipment>();
this.LineRepository = new Repository<Line>();
}
}
所有这些都有效......但是我试图添加的是类中的一个方法,该方法根据字符串值返回上面的存储库之一。
public IRepository<Object> SetRepo(string TableName)
{
switch (TableName)
{
case "Line":
return LineRepository;
break;
}
}
我知道上面的方法不起作用,但它让您了解我想要实现的目标。我的目标是我应该能够在我的代码中设置类似的东西来调用存储库:
StagingRepository _repo = new StagingRepository();
var myList = _repo.SetRepo("Line").All(); //All is a function of IRepository
任何帮助将不胜感激。
最佳答案
您可以制作IRepository
covariant :
public interface IRepository<out T>
这样,您就可以随时使用 IRepository<Derived>
代替IRepository<Base>
从方法返回时。在您的情况下,您的代码现在将编译并运行:
public IRepository<object> SetRepo(string TableName)
{
switch (TableName)
{
case "Line":
return LineRepository;
break;
}
}
因为Line
源自object
,这样您就可以返回 IRepository<Line>
对于 IRepository<object>
.
但是,如果您使用T
,这将不起作用。作为参数 - 类型不能同时是协变和逆变的。在这种情况下,请考虑从IRepository<T>
移动非泛型方法。到非通用版本IRepository
并使您的存储库同时实现这两者。这样你就可以:
public IRepository SetRepo(string TableName)
// ...
顺便说一句,名字SetRepo
具有误导性 - 该函数不会设置任何内容,而是“获取”适当的存储库。
关于c# - 如何使方法返回泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32254801/