簡體   English   中英

獲得帶有通用參數的接口的具體實現

[英]Get Concrete Implementation of Interface with Generic Parameter

我現在感覺很傻。 不知道為什么我不能解決這個問題。 我有一個存儲庫接口:

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

我只需要弄清楚該方法返回什么,其他方法就可以對我返回的任何存儲庫執行操作。 我如何重構它才能使其正常工作? 我很確定我有一個協方差/相反的問題。 再次,我感覺很愚蠢,只是畫了一個空白。

謝謝。

您可以分兩個階段進行。 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);

    }
}

基本類型的通用返回參數呢

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM