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