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