声明List <IEntity <T >>其中T:class

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)

这甚至可能吗?

Stu*_*tLC 5

您还需要参数化 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>为消费者公开读取列表,并添加显式方法来更改内部集合.