【问题标题】:Casting from object to IList<T> derived class: foreach fails从对象转换为 IList<T> 派生类:foreach 失败
【发布时间】:2020-01-13 13:14:27
【问题描述】:

我有一个自定义class MyList&lt;T&gt; : MyBaseList, IList&lt;T&gt; 和它的一些实例myList1, myList2...,我将其存储为object(来自反射,我无法更改)在List&lt;object&gt; ListOfLists = new List&lt;object&gt;() 中,例如myList1 被装箱为object 存储在 ListOfLists[0] 等等。

我的班级MyList&lt;T&gt; 实现:

private List<T> items = new List<T>();
...
IEnumerator IEnumerable.GetEnumerator()
{
   return this.items.GetEnumerator();
}

当尝试遍历myList1, myList2... 的每个元素时...

bool Iterate<T>(T targetElem)
{
   foreach (var listObj in ListOfLists)
   {
      var myIList= (IList<T>)listObj;
      var myEList = myIList.Cast<MyList<T>>();

      foreach (var myList in myEList)
      {
         foreach (var listElem in myList)
         {
            if (EqualityComparer<T>.Default.Equals(listElem , targetElem)) return true;
         }
      }
   }
   return false;
}

...我在foreach (var myList in myEList) 收到错误System.InvalidCastException

有人知道如何解决这个问题吗?
提前致谢!

【问题讨论】:

  • 什么是MyList&lt;T&gt;
  • 一个接受任何对象的自定义类...更新
  • 请发minimal reproducible example,这样我们才能真正在本地重现您的问题。
  • 您的Iterate 方法应该做什么?检查一个元素是否在列表列表中?我觉得你有一个额外的 foreach 循环......
  • 我的ListOfLists 包含许多MyList&lt;T&gt; 的实例,被装箱为对象; listObj´ is each of these objects (boxed lists) that I retrieve from ListOfLists`。

标签: c# foreach casting ienumerable


【解决方案1】:

您似乎编写了一个额外的foreach 循环。要遍历列表列表,您只需要 2 个。您似乎还试图将每个子列表中的每个 T 对象强制转换为 MyList&lt;T&gt;,这没有多大意义。

您可能打算这样做:

foreach (var listObj in ListOfLists)
{
    var myIList= (IList<T>)listObj;

    foreach (var listElem in myIList)
    {
        if (EqualityComparer<T>.Default.Equals(listElem , targetElem)) return true;
    }
}
return false;

我不知道您为什么如此确定每个子列表都必须是T 的列表。也许其中一个不是,谁知道呢?如果是这种情况,您可以使用as 强制转换并检查是否为空:

foreach (var listObj in ListOfLists)
{
    var myIList= listObj as IList<T>;

    if (myIList == null) continue;

    foreach (var listElem in myIList)
    {
        if (EqualityComparer<T>.Default.Equals(listElem , targetElem)) return true;
    }
}
return false;

【讨论】:

    【解决方案2】:

    问题出在这里:

    var myEList = myIList.Cast<MyList<T>>();
    

    在这里,您尝试将myIList 中的每个项目转换为MyList&lt;T&gt; 的实例。由于Cast 的执行被推迟了,你得到的错误不在foreach 之前。

    据我了解你应该这样做

    var myEList = myIList.Cast<T>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      相关资源
      最近更新 更多