gpt4 book ai didi

c# - 声明 List> 其中 T :class

转载 作者:行者123 更新时间:2023-12-01 18:58:24 26 4
gpt4 key购买 nike

我已经制作了一个界面

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?)

这可能吗?

最佳答案

您还需要参数化myClass

public class myClass<T> where T : class
{
public List<IEntity<T>> NewList = new List<IEntity<T>>();
}

您现在可以实例化:

var instance = new myClass<Foo>();

必须注意的是,将成员字段公开为公共(public)字段通常不是一个好的做法:)

请注意,您的界面存在问题:

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);
}

编辑、重新封装

例如,您可以使用私有(private) setter 封装属性(在构造函数中初始化列表) - 这至少会阻止消费者重新分配列表。

public IList<IEntity<T>> NewList { get; private set; }

public myClass()
{
NewList = new List<IEntity<T>>();
}

更好的是,根据您的设计,您可以隐藏 List完全实现,公开 IEnumerable<T>供消费者读取列表,并添加更改内部集合的显式方法。

关于c# - 声明 List<IEntity<T>> 其中 T :class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27372545/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com