【问题标题】:How to know which type to use when use foreach on an IEnumerable type?在 IEnumerable 类型上使用 foreach 时如何知道使用哪种类型?
【发布时间】:2010-12-17 00:03:09
【问题描述】:

我有一个实现 IEnumerable 接口的对象。在 C# 中,我可以使用 foreach 来迭代它的所有元素。但是我想知道如何确定 foreach 循环中的类型?

【问题讨论】:

  • 你为什么使用非通用的IEnumerable?你还在使用 .net 1.x 吗?
  • 无论如何,拥有一个你不知道里面是什么的任何东西的 IEnumerable 并不常见。也许你能解释一下情况吗?

标签: c# .net


【解决方案1】:

如果你有一个旧样式IEnumerable(不是IEnumerable<T>),你通常可以调用.Cast<T>.OfType<T> 来获得一个强类型的.ForEach<T> over...

如果您不知道T,那么您可以致电Debug.Write(item.GetType())

【讨论】:

    【解决方案2】:

    如果您只使用 IEnumerable,则必须使用对象。如果你知道真正的类型,那么你可以强制转换该对象。

    您也可以使用通用的 IEnumberable,然后就不需要进行强制转换了。

    【讨论】:

    • foreach 自动转换为您用于变量声明的类型。
    【解决方案3】:

    你为什么不试试 var?

    foreach(myEnumerable 中的变量项) { ... }

    【讨论】:

    • 这与使用 object 而不是 var 没有什么不同。
    • 如果右侧只是一个 IEnumerable 那么 var 将成为对象。所以它不会帮助 OP。
    【解决方案4】:

    如果没有 IEumerable 的通用变体,就没有很好的了解方式。 您可以使用 is 运算符来检查 enumerable 中的第一项以及不同的 foreach 循环,但我不推荐它。

    【讨论】:

      【解决方案5】:

      如果您使用的是非泛型IEnumerable,则无法在编译时推断通过接口返回的项目类型。如果您对该对象足够了解,您可能知道它只包含特定类型,这意味着您可以(相对安全地)构造一个具有已知类型的foreach 循环。例如,如果你知道它只返回字符串,你可以像这样遍历对象:

      foreach(string s in myObject)
      {
          // Do some operation.
      }
      

      很遗憾,您可以从非通用 IEnumerable 返回任何项。如果IEnumerable 返回float,您将在第一行收到InvalidCastException

      更糟糕的是,没有什么可以阻止元素在同一序列中成为多种类型。该对象可以在一个foreach 循环中合法地返回以下类型。

      1. string
      2. int
      3. float
      4. DateTime

      如果您不知道对象的文档,那么了解循环中任何一项的类型的唯一其他确定方法是在运行时检查。

      这就是为什么当您知道您的对象只会真正返回一种类型的值时,使用通用 IEnumerable<T> 而不是 IEnumerable 总是更可取的原因。

      【讨论】:

        猜你喜欢
        • 2011-01-25
        • 2013-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-10
        相关资源
        最近更新 更多