我如何使一个方法返回一个泛型方法

本文关键字:一个 泛型方法 返回 何使一 方法 | 更新日期: 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这个名字是有误导性的——这个函数没有设置任何东西,而是"获取"一个适当的存储库。