我已经创建了一个界面
public interface IEntity<T> where T:class
{
public Save(T entity);
public Update(T entity);
IEnumerable<T> GetAll();
T GetById(int id);
}
现在,我有另一个类,我想创建这个IEntity类型的列表。
public class myClass
{
public List<IEntity<T>> NewList = new List<IEntity<T>>(); // how to tell the compiler where T is class
}
但是这给了我错误的说法
The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)
这甚至可能吗?
答案 0 :(得分:5)
您还需要参数化myClass
public class myClass<T> where T : class
{
public List<IEntity<T>> NewList = new List<IEntity<T>>();
}
您现在可以实例化:
var instance = new myClass<Foo>();
并且必须注意,将成员字段公开为公开通常不是一种好的做法:)
请注意,您的界面包含以下问题:
public interface IEntity<T> where T:class
{
void Save(T entity); // Must have return type
void Update(T entity); // Drop the public
IEnumerable<T> GetAll();
T GetById(int id);
}
编辑,重新封装
例如,您可以使用私有setter(在构造函数中初始化的列表)封装一个属性 - 这至少会阻止消费者重新分配列表。
public IList<IEntity<T>> NewList { get; private set; }
public myClass()
{
NewList = new List<IEntity<T>>();
}
更好的是,根据您的设计,您可以完全隐藏List
实现,为消费者公开IEnumerable<T>
以读取列表,并添加显式方法来更改内部集合。