【问题标题】:Array, List, IEnumerable, CustomList class cast to one and iterate threw themArraylist、IEnumerable、自定义列表类强制转换为一个并迭代将它们扔掉
【发布时间】: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


【解决方案1】:

您可以尝试使用as 运算符进行投射:

var enumerable = list as IEnumerable;
if (enumerable != null)
{
    foreach (object item in enumerable)
    { 
        // ...
    }
}

但是,如果您需要修改它,则必须重新创建它。例如,通过使用您填写循环的列表。然后将其重新分配给原始变量。

或者您可以首先检查类型是否为ILIst(如数组或列表),然后您可以使用它的索引器:

var ilist = list as IList;
if (ilist != null)
{
    for (int i = 0; i < ilist.Count; i++)
    {
        ilist[i] = "new value";
    }
}

【讨论】:

  • 如何设置 IEnumerable 的条目,到目前为止我已经使用了 array.SetValue(obj, index)?
  • 我收到以下消息:“只读局部变量不能用作赋值目标”
  • 如果我没记错的话,这(...作为 IList)不会在 IEnumerable/IEnumerable 或仅实现其中之一的 CustomLists 上工作?
  • 或者有没有办法制作一个可写的.GetEnumerator().Current,也许是一个可以完成这项工作的静态扩展?
  • 不,您不能编辑Enumerator.CurrentIEnumerable 提供对集合的只读和只进枚举。仅此而已。
【解决方案2】:

IIRC,您可以通过

对可枚举接口进行简单的继承检查
if (FooList is IEnumerable)
    // We have a List

你也可以使用 Linq 做一个

if (FooList.ToList().Count > 1)
    // We have a List

但这将是非常规的。

【讨论】:

    猜你喜欢
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多