2010-10-19 146 views
4

我有一个包含对象列表的自定义控件。该控件由可视化设计器实例化,然后在代码中进行配置。该控件是一个显示实体列表的网格。C#:非泛型类型中的泛型成员?

我有一个像这样的初始化方法。

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 

但现在我想将OBJ文件参数分配给ICollection<IPersistentObject>类的成员变量不工作。

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

我该怎么办?

回答

2

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

  1. 代码的包装围绕ICollection<T>一个包装了ICollection<IPersistentObject>并执行类型检查你。
  2. 改为使用IEnumerable<T>,它确实支持您描述的方式的变化。
  3. 如果您的具体类实现它,请使用非通用IList
+0

1号为我工作,谢谢。 – 2010-10-19 16:13:29

0

您可以将成员变量更改为非通用ICollection,并根据需要进行强制转换。

+0

由于'ICollection '不会继承非通用'ICollection'接口,因此它不健壮。可以想象的是,实现第一个接口但不是后者的类型。 – Ani 2010-10-19 12:00:02

3

如果你不需要到OBJ文件是一个实际的集合(例如用Add/Remove方法等),那么你可以更换ICollectionIEnumerable

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

不幸的是我需要添加/删除,因为列表将被控件修改。 – 2010-10-19 12:03:24