如何知道在IEnumerable类型上使用foreach时要使用的类型?

时间:2010-12-16 10:35:46

标签: c# .net

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

5 个答案:

答案 0 :(得分:2)

如果您只使用IEnumerable,则必须使用object。如果您知道真实类型,那么您可以投射该对象。

你也可以使用通用的IEnumberable,然后你就不需要进行演员了。

答案 1 :(得分:2)

如果您使用旧样式IEnumerable(不是IEnumerable<T>),通常可以致电.Cast<T>.OfType<T>以获得强类型.ForEach<T> ...

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

答案 2 :(得分:0)

你为什么不试试var?

foreach(myEnumerable中的var项) {    ... }

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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

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

  1. string
  2. int
  3. float
  4. DateTime
  5. 如果你不从对象的文档中知道,那么知道循环中任何一个项的类型的唯一其他方法是在运行时检查。

    这就是为什么当你知道你的对象只会真正返回一种类型的值时,最好使用泛型IEnumerable<T>而不是IEnumerable