我有一个实现IEnumerable接口的对象。在C#中,我可以使用foreach迭代其所有元素。但是我想知道如何确定foreach循环中的类型?
答案 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
循环内返回以下类型。
string
int
float
DateTime
如果你不从对象的文档中知道,那么知道循环中任何一个项的类型的唯一其他方法是在运行时检查。
这就是为什么当你知道你的对象只会真正返回一种类型的值时,最好使用泛型IEnumerable<T>
而不是IEnumerable
。