【发布时间】:2014-01-25 08:54:50
【问题描述】:
我正在尝试找出一种方法来告诉我某种类型是否是数组/列表/ienumerable/集合...我不在乎它是什么类型,甚至是 CustomLists 之类的东西
FooList<T> : IList<T>
FooList : IList
或类似的东西。
我有点希望一个简单的 type.IsArray 就足够了,但遗憾的是事实并非如此。
我需要一种方法来检查它是否是上述类型之一,然后检查底层类型是什么,然后将其转换为基于索引的集合,我可以在其中循环访问条目。
对于一个简单的数组,这就是我所需要的:
if (obj.GetType().IsArray)
{
var elementType = obj.GetType().GetElementType();
if (elementType.IsPrimitive == false)
{
var array = (Array)obj;
}
}
这应该适用于每个集合,有可能。
编辑:
按照下面的建议,我应该使用 IEnumerable,但使用 IEnumerable 我遇到的问题是我无法在此 IEnumerable 中设置某些对象。
对于数组,我使用了 array.SetValue(obj, index) 方法,效果很好。
当我循环抛出 IEnumerable 并尝试像这样设置一个条目时:
var list = obj as IEnumarble;
if (list != null)
{
foreach (var item in list)
{
item = new object();
}
}
我收到以下消息:
Readonly local variable cannot be used as an assignment target.
【问题讨论】:
-
并非所有这些类型都是数组,但它们都实现了
IEnumerable,所以你可以从那里开始。
标签: c# arrays collections casting ienumerable