2010-02-24 54 views
0

我想確定一個對象x是否是一個列表。它可以是任何類型的列表和任何通用參數。識別一個對象是否是List類型並迭代它

如果是這樣,那麼我想重複它,如果它是。這是我能想到的最好的,但由於彙編錯誤而失敗

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

我該怎麼做?

回答

2

最簡單的方法是投射到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

0
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

2

您可以使用「爲」保存一投:

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