c# - 如何使方法返回泛型方法?

标签 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

任何帮助将不胜感激。

最佳答案

您可以制作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/

相关文章:

c# - 如何在 .js 文件中嵌入 Razor C# 代码?

c# - Put call 在 PostMan 中有效,但在 RestSharp 中无效 : Getting a bad request

asp.net - 使用 itextsharp 将印地语 unicode 字体转换为 pdf

c# - 不同系列之间的堆叠条形边框

c#-4.0 - Expression.Call和 "Ambiguous Match Found"

.net - 用户代码中未处理 WebFaultException

c# - 部分类有什么用?

c# - 实时环境中的 WCF 或套接字通信?

c# - 如何获取操作委托(delegate)调用的名称/详细信息?

c# - 模拟跨上下文连接--LINQ/C#