声明列表<ientity <t>&gt;其中T:class </ientity <t>

时间:2014-12-09 06:13:56

标签: 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);
}

现在,我有另一个类,我想创建这个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?)

这甚至可能吗?

1 个答案:

答案 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>以读取列表,并添加显式方法来更改内部集合。