C#:非泛型类型的通用成员?

时间:2010-10-19 11:41:33

标签: c# collections generics

我有一个自定义控件,其中包含一个对象列表。控件由可视化设计器实例化,然后在代码中配置。控件是一个显示实体列表的网格。

我有这样的初始化方法。

public void Initialise(ISession session, Type type, ICollection<IPersistentObject> objs)

IPersistentObject是一个接口。但是,当我想分配一个实现IPersistentObject的东西的集合时,这不起作用。

所以我改成了它。

public void Initialise<T>(ISession session, Type type, ICollection<T> objs) where T : class, IPersistentObject

但是现在我想将objs参数分配给ICollection<IPersistentObject>类型的成员变量,该变量不起作用。

我不能使该类具有通用性,因为它是一个不能具有泛型类型AFAIK的控件。我无法复制集合,因为控件必须修改传入的集合,而不是复制并修改它。

我该怎么办?

3 个答案:

答案 0 :(得分:3)

如果您不需要将objs作为实际集合(例如使用Add / Remove方法等),那么您可以将ICollection替换为IEnumerable }。

void Initialise(ISession session, Type type, IEnumerable<IPersistentObject> objs)

答案 1 :(得分:2)

ICollection<T>不支持这样的通用差异。在我看来,你的选择是:

  1. 围绕ICollection<T>编写包装ICollection<IPersistentObject>的包装,并为您进行类型检查。
  2. 请改用IEnumerable<T>,它确实支持您描述的方式的差异。
  3. 如果您的具体类实现它,请使用非泛型IList

答案 2 :(得分:0)

您可以将成员变量更改为非泛型ICollection,并根据需要进行投射。