c# - 使用通用参数获取接口(interface)的具体实现

标签 c# generics interface abstraction

我现在感觉很蠢。不知道为什么我无法解决这个问题。我有一个存储库接口(interface):

public interface ICollateralItemBaseImplementation<T> where T : CollateralItemBase
{
    int Add(T collateralItem);
    T Get(int collateralID);
}

以及许多实现,每个实现继承自 Collat​​eralItemBase 的 10 个模型之一。例如:

internal sealed class CollateralItemCertifiedDepositRepository : ServiceBaseRepository, ICollateralItemBaseImplementation<CollateralItemCertifiedDeposit>
{
   int Add(CollateralItemCertifiedDeposit collateralItem) { /*...*/ }
   CollateralItemCertifiedDeposit Get(int collateralID)  { /*...*/ }
}  

现在我只需要打开传入的 Collat​​eralItemBase 类型即可获取我需要的存储库:

private ICollateralItemBaseImplementation<???> GetRepository(CollateralItemBase item) 
{
    switch (item.GetType().Name)
    {
            case "CollateralItemCertifiedDeposit": return new CollateralItemCertifiedDepositRepository();
            //...
    }

我只需要弄清楚从这个方法返回什么,以便其他方法对我返回的任何存储库起作用。我如何重构它才能使其正常工作? 我很确定我有协方差/逆变问题。再次,我感觉自己很愚蠢,只是画了一片空白。

谢谢。

最佳答案

您可以分两个阶段进行。将非通用基本接口(interface)添加到 ICollat​​eralItemBaseImplementation,然后转换为通用版本。

public interface ICollateralItemBaseImplementation
{
}

public interface ICollateralItemBaseImplementation<T> : ICollateralItemBaseImplementation
    where T : CollateralItemBase
{
    int Add(T collateralItem);
    T Get(int collateralID);
}

public static class RepositoryFactory
{
    public static ICollateralItemBaseImplementation<T> GetRepository<T>(T item)
        where T : CollateralItemBase
    {
        return (ICollateralItemBaseImplementation<T>)GetRepositoryImpl(item);
    }

    private static ICollateralItemBaseImplementation GetRepositoryImpl<T>(T item)
            where T : CollateralItemBase
    {
        switch (item.GetType().Name)
        {
            case "CollateralItemCertifiedDeposit":
                return new CollateralItemCertifiedDepositRepository();
        }
        return null;
    }
}

internal static class Program
{

    static void Main()
    {
        var repo = RepositoryFactory.GetRepository(new CollateralItemCertifiedDeposit());
        Debug.Assert(repo is CollateralItemCertifiedDepositRepository);

    }
}

关于c# - 使用通用参数获取接口(interface)的具体实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32363614/

相关文章:

java - 如何将非泛型类集成到泛型层次结构中?

c# - 接口(interface)参数

c# - 刷新表格而不重新加载页面并且不丢失 css 设计

c# - 防止密码泄露(GetNetworkCredential 方法)

c# - 一组可以相互比较的自定义类型

java - 接受父类(super class)作为参数,但在方法中使用子类

c# - 我应该如何在通用类/表单中使用变量?

c# - 为什么 IDictionary<TKey, TValue> 同时实现 ICollection 和 IEnumerable

java - 从继承自同一父类(super class)的多个类实现回调接口(interface)时发生冲突

c# - CollectionAssert.AreEquivalent 失败......无法弄清楚为什么