C#: 非泛型类型中的泛型成员?

4

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

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

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>的成员变量,但这不起作用。
我无法使该类泛型,因为据我所知,它是一个不能有泛型类型的控件。我无法复制集合,因为控件必须修改传入的集合,而不是复制并修改那个集合。
我该怎么办?
3个回答

3

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

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

很遗憾,由于控件将修改列表,我需要添加/删除。 - Mike Q

2

ICollection<T> 不支持这样的泛型变化。我认为你有以下几个选择:

  1. 编写一个包装器,将 ICollection<T> 包装成一个 ICollection<IPersistentObject> 并为您执行类型检查。
  2. 改用支持您所描述的方式的 IEnumerable<T>
  3. 如果您的具体类实现了它,则使用非泛型的 IList

0

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


由于“ICollection <T>”没有继承非泛型的“ICollection”接口,因此这不是健壮的。可以想象有一种类型实现了第一个接口但没有实现后者。 - Ani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接