Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用泛型参数获取接口的具体实现_C#_Generics_Interface_Abstraction - Fatal编程技术网

C# 使用泛型参数获取接口的具体实现

C# 使用泛型参数获取接口的具体实现,c#,generics,interface,abstraction,C#,Generics,Interface,Abstraction,我现在觉得自己很笨。不知道为什么我不能解决这个问题。我有一个存储库界面: public interface ICollateralItemBaseImplementation<T> where T : CollateralItemBase { int Add(T collateralItem); T Get(int collateralID); } 现在,我只需要打开传入的CollateralItemBase类型即可获得我需要的存储库: private IColla

我现在觉得自己很笨。不知道为什么我不能解决这个问题。我有一个存储库界面:

public interface ICollateralItemBaseImplementation<T> where T : CollateralItemBase
{
    int Add(T collateralItem);
    T Get(int collateralID);
}
现在,我只需要打开传入的
CollateralItemBase
类型即可获得我需要的存储库:

private ICollateralItemBaseImplementation<???> GetRepository(CollateralItemBase item) 
{
    switch (item.GetType().Name)
    {
            case "CollateralItemCertifiedDeposit": return new CollateralItemCertifiedDepositRepository();
            //...
    }
private ICollateralItemBaseImplementation GetRepository(CollateralItemBase项目)
{
开关(item.GetType().Name)
{
案例“CollateralItemCertifiedPosite”:返回新的CollateralItemCertifiedPositionRepository();
//...
}
我只需要弄清楚从这个方法中返回什么,让其他方法对我返回的存储库起作用。我如何重构它以使其工作? 我很确定我有一个协方差/反方差的问题。再一次,我感觉很傻,只是画了一个空白


谢谢。

基本类型的通用返回参数怎么样

private ICollateralItemBaseImplementation<T>     GetRepository(CollateralItemBase item)  where T : ServiceBaseRepository
{
switch (item.GetType().Name)
{
        case "CollateralItemCertifiedDeposit": return new CollateralItemCertifiedDepositRepository();
        //...
}
private ICollateralItemBaseImplementation GetRepository(CollateralItemBase项目),其中T:ServiceBaseRepository
{
开关(item.GetType().Name)
{
案例“CollateralItemCertifiedPosite”:返回新的CollateralItemCertifiedPositionRepository();
//...
}

您可以分两个阶段完成。将非通用基本接口添加到
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);

    }
}
公共接口ICollateralItemBaseImplementation
{
}
公共接口ICollateralItemBaseImplementation:ICollateralItemBaseImplementation
式中T:CollateralItemBase
{
int-Add(T-collateralItem);
T获得(int抵押);
}
公共静态类RepositoryFactory
{
公共静态ICollateralItemBaseImplementation GetRepository(T项)
式中T:CollateralItemBase
{
返回(ICollateralItemBaseImplementation)GetRepositoryImpl(项);
}
私有静态ICollateralItemBaseImpl实现GetRepositoryImpl(T项)
式中T:CollateralItemBase
{
开关(item.GetType().Name)
{
案例“抵押物证明存款”:
返回新的CollateralItemCertifiedPositionRepository();
}
返回null;
}
}
内部静态类程序
{
静态void Main()
{
var repo=RepositoryFactory.GetRepository(new CollateralItemCertifiedDeposit());
断言(repo是collateralItemCertifiedDepository);
}
}

不应该
GetRepository
是一个通用方法,这样你就可以将类型作为参数传递,而不是传递一个除了通过反射检查类型之外你无法访问的对象吗?它可能是潜在的。但是在我的应用程序(wpf)中,我实际上不需要亲自操作真正的类型。我使用模板选择器为实际类型获取正确的模板,绑定“神奇地”工作,而无需我强制转换。因此,在我所有的ViewModels中,我使用的是不会编译的
CollateralItemBase
类型。首先
t
应该是
CollateralI类型temBase
Second,
collateralItemCertifiedDepository
没有实现
ICollateralItemBaseImplementation
,它只实现了
ICollateralItemBaseImplementation
,所以当您尝试返回它时,会出现一个错误。谢谢Colin。我想我必须有一个非泛型接口才能获得类型正在工作,这帮我修好了
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);

    }
}