如果任何类IEnumerable
在其层次结构的某个阶段实现接口,是否可以创建一个集合并填充该类?
我想编写一个简单的函数,如果它需要一个实现 , 等的对象,IList<>
或者ICollection<>
是IEnumerable<>
一个Array
(所以在某个阶段都实现了IEnumerable
),我可以用一组值填充它。
所以这个函数不知道它是否会接收一个List<object>
或object[]
但将能够填充两者。
谢谢。
如果任何类IEnumerable
在其层次结构的某个阶段实现接口,是否可以创建一个集合并填充该类?
我想编写一个简单的函数,如果它需要一个实现 , 等的对象,IList<>
或者ICollection<>
是IEnumerable<>
一个Array
(所以在某个阶段都实现了IEnumerable
),我可以用一组值填充它。
所以这个函数不知道它是否会接收一个List<object>
或object[]
但将能够填充两者。
谢谢。
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 来制作非通用版本。