识别一个对象是否是List类型并迭代它

问题描述:

我想确定一个对象x是否是一个列表。它可以是任何类型的列表和任何通用参数。识别一个对象是否是List类型并迭代它

如果是这样,那么我想重复它,如果它是。这是我能想到的最好的,但由于汇编错误而失败

if(x is List){ 
    foreach(Object o in (List)x){ 
     ; 
    } 
} 

我该怎么做?

最简单的方法是投射到IList。这是一个非通用接口,并可以通过非泛型列表(例如ArrayList)来实现,但我猜会不会是你所关心:

if (x is IList) { 
    foreach (object o in (IList)x) { 
    // ... 
    } 
} 

(如果你需要do是foreach,你甚至不需要IList:IEnumerable就足够了。)

请注意,非泛型IList和IEnumerable位于System.Collections命名空间中,默认情况下它不是使用-ed。因此,您需要添加using System.Collections;(感谢Reed Copsey注意到这一点)。

+0

我仍然得到:使用通用型“System.Collections.Generic.IList ” – Casebash 2010-02-24 02:10:24

+3

确保添加“使用系统.Collections;”在文件的顶部。 itowlson的代码应该可以工作。 – 2010-02-24 02:11:37

if (x.GetType().IsInstanceOfType(typeof(IList<string>))) 
{ 
    foreach (Object o in x) // replace with you type 
    { } 
} 
+0

if条款将起作用,但它仍然会给foreach上的编译器错误。 – itowlson 2010-02-24 02:18:44

+0

这是什么错误?如果x = 'IList x = new列表();' – 2010-02-24 02:23:12

+0

当然,它将在该代码片段中编译,因为x已编译时间类型为IList '。但问题是关于你(和编译器)*什么时候不知道x是否是一个列表 - 这就是他不得不施放的原因。他的场景更像是'object x = new List ();' - 并且编译器不会让你在没有强制转换的情况下对x进行foreach。 (事实上​​,在这种情况下,即使if子句也会失败,因为它是'List '而不是'List '。) – itowlson 2010-02-24 02:39:46

您可以使用“为”保存一投:

var xList = x as IList; 
if(x != null) { 
    foreach(object o in xList){ 
     // ... 
    } 
}