如何使方法返回泛型方法?

时间:2015-08-27 16:23:50

标签: c# c#-4.0

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

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

您可以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具有误导性 - 该功能没有设置任何内容,而是“获取”适当的存储库。

相关问题