用通用参数获得接口的具体实现

时间:2015-09-02 21:42:06

标签: c# generics interface abstraction

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

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

和许多实现,每个实现实现从CollateralItemBase继承的10个模型之一。例如:

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

现在我只需要打开传入的CollateralItemBase类型以获取我需要的存储库:

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

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

感谢。

2 个答案:

答案 0 :(得分:3)

你可以分两个阶段完成。向ICollateralItemBaseImplementation添加非通用基接口,然后转换为通用版本。

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

    }
}

答案 1 :(得分:-1)

基类型的通用返回参数

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