如何使方法 return 成为通用方法?

How do I make a method return a generic method?

我正在创建一个存储库,如下所示:

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>();
    }
}

所有这些都有效...但是我要添加的是 class 中的一种方法,returns 上述存储库之一基于字符串值。

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>

这样,当从一个方法 returning 时,您总是可以使用 IRepository<Derived> 代替 IRepository<Base>。对于您的情况,您的代码现在可以编译并运行:

public IRepository<object> SetRepo(string TableName)
{
    switch (TableName)
    {
        case "Line":
            return LineRepository;
            break;
    }
}

因为Line是从object派生出来的,所以你可以returnIRepository<Line> for IRepository<object>.

但是,如果您使用 T 作为参数,这将不起作用 - 类型不能同时是协变和逆变。在这种情况下,请考虑将非泛型方法从 IRepository<T> 移动到非泛型版本 IRepository 并让您的存储库同时实现这两种方法。这样你就可以拥有:

public IRepository SetRepo(string TableName)
// ...

顺便说一下,名称 SetRepo 具有误导性 - 该函数没有设置任何内容,而是 "gets" 一个适当的存储库。