我如何使一个方法返回一个泛型方法
本文关键字:一个 泛型方法 返回 何使一 方法 | 更新日期: 2023-09-27 18:10:10
我正在创建一个存储库,如下所示:
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
协变:
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<object>
返回IRepository<Line>
。
但是,如果使用T
作为参数类型,这将不起作用-类型不能同时是协变和逆变。在这种情况下,请考虑将非泛型方法从IRepository<T>
移动到非泛型版本IRepository
,并使您的存储库实现这两个版本。这样你就可以:
public IRepository SetRepo(string TableName)
// ...
顺便说一下,SetRepo
这个名字是有误导性的——这个函数没有设置任何东西,而是"获取"一个适当的存储库。