获取具有通用参数的接口的具体实现
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();
//...
}
我只需要弄清楚从这个方法中 return 的内容,以便其他方法作用于我 return 的任何存储库。我如何重构它以使其正常工作?
我很确定我遇到了 covariance/contravariance 问题。再一次,我感觉很愚蠢,只是画了一个空白。
谢谢。
基类型
的通用return参数怎么样
private ICollateralItemBaseImplementation<T> GetRepository(CollateralItemBase item) where T : ServiceBaseRepository
{
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);
}
}
我现在感觉很蠢。不知道为什么我不能解决这个问题。我有一个存储库界面:
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();
//...
}
我只需要弄清楚从这个方法中 return 的内容,以便其他方法作用于我 return 的任何存储库。我如何重构它以使其正常工作? 我很确定我遇到了 covariance/contravariance 问题。再一次,我感觉很愚蠢,只是画了一个空白。
谢谢。
基类型
的通用return参数怎么样private ICollateralItemBaseImplementation<T> GetRepository(CollateralItemBase item) where T : ServiceBaseRepository
{
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);
}
}