【发布时间】:2020-01-16 19:16:44
【问题描述】:
我想做一些我在 Java 中做过的事情。 我有一个通用类型的接口,例如:
interface IDAO<T>
{
void Save(T data);
}
我有两个实现这个接口的类:
class BankAccountDAO : IDAO<BankAccount>
{
public void Save(BankAccount data){...}
}
class CategoryDAO : IDAO<Category>
{
public void Save(Category data) {...}
}
我需要另一个带有 List 的类,它应该声明为 IDAO 类型和泛型 T,以便我可以像这样将具体类添加到这个列表中:
class Manager
{
private List<IDAO> daoList = new List<IDAO>(); // here is the error
daoList.Add(new BankAccountDAO());
daoList.Add(new CategoryDAO());
public void myMethod(BankAccount b)
{
daoList.ElementAt(0).Save(b); // this should call the implemented Save() method of BankAccountDao
}
}
我在 Java 中为一个项目执行此操作,但当我尝试在 C# 中执行此操作时出现错误:
CS0305 C# 使用泛型类型需要 1 个类型参数
有什么办法可以做这样的事情吗?
【问题讨论】:
-
这是因为 C# 有真正的泛型而不是像 Java 这样的假泛型,所以
IDAO<BankAccount>和IDAO<Category>是不同的类型 -
为什么不用字典?或类似 DI 正在使用的东西......首先注册像
TypeFactory.Register<IDAO<BankAccount>, BankAccountDAO>()或TypeFactory.Register<IDAO<BankAccount>>(new BankAccountDAO())然后使用TypeFactory.Resolve<IDAO<BankAccount>>().Save(new BankAccount { ... })
标签: c# list generics interface generic-collections