0

如果任何类IEnumerable在其层次结构的某个阶段实现接口,是否可以创建一个集合并填充该类?

我想编写一个简单的函数,如果它需要一个实现 , 等的对象,IList<>或者ICollection<>IEnumerable<>一个Array(所以在某个阶段都实现了IEnumerable),我可以用一组值填充它。

所以这个函数不知道它是否会接收一个List<object>object[]但将能够填充两者。

谢谢。

4

1 回答 1

0

IEnumerable接口仅指定一种方法,该方法为您提供枚举器以枚举对象的项。因此没有关于该对象的其他能力是什么的信息。因此,您无法从外部判断项目的数量是固定的,还是可变的,甚至是可变的。

提供此接口的第一个接口是IList,除了随机访问之外,它还提供添加对象的方法。仅仅因为你有一个 IList 并不意味着你有写权限,因为 IList 可以是只读的。还有IDictionary为类字典对象指定添加方法。所有其他标准集合通常不实现为您提供此功能的接口。

因此,您不能在不知道其实现或至少更具体的实现细节(IList 或 IDictionary)的情况下用值填充任意集合。

我不需要捕获所有功能,我只需要涵盖大多数情况的东西。因此,如果通过了 IEnumerable、ICollection 或 IList,那么我可以只返回一个列表。

如果你得到一个IList<T>or ICollection<T>,你也有一个IEnumerable<T>(因为两者都实现了它),所以你只有一个案例。您可以只接受一个 IEnumerable 并基于它创建一个列表:

public IList<T> CreateList<T> (IEnumerable<T> enumerable)
{
    List<T> list = new List<T>(enumerable);

    // add custom items
    list.Add(GetCustomItem<T>());

    return list;
}

<T>如果您愿意,您还可以通过从定义中删除所有 s 来制作非通用版本。

于 2013-01-28T10:26:57.500 回答