2011-07-18 42 views
10

有沒有一種快速的方法來確定object變量的內容是否支持IEnumerable?具體來說,我正在使用XPathEvaluate()從System.Xml.XPath,它可以「An object that can contain a bool, a double, a string, or an IEnumerable.測試對象是否爲IEnumerable的最快捷方式是什麼?

所以執行後返回:

XDocument content = XDocument.Load("foo.xml"); 
object action = content.XPathEvaluate("/bar/baz/@quux"); 
// Do I now call action.ToString(), or foreach(var foo in action)? 

我可以閒逛與action.GetType().GetInterface(),但我認爲我會問,如果有一個更快/更簡單的方法。

回答

22

您正在尋找is操作:

if(action is IEnumerable) 

甚至更​​好的as運營商。

IEnumerable enumerable = (action as IEnumerable); 
if(enumerable != null) 
{ 
    foreach(var item in enumerable) 
    { 
    ... 
    } 
} 

注意string也實現IEnumerable,所以你可能會喜歡到檢查擴展到if(enumerable != null && !(action is string))

+2

注意的事實是'字符串'也實現'IEnumerable'。特別是當你的對象可能是一個字符串(比如'XPathEvaluate'的返回值),並且你真的想知道你是否有一個_collection_時,你可以使用一個擴展的檢查,如if(action is IEnumerable &&!(action is string))' – Alex

+0

@Alex非常真實。 – Jamiec

2

使用is operator

if(action is IEnumerable) 

這是它做什麼:

如果提供表達式,則表達式的計算結果爲真n非空,並且提供的對象可以轉換爲提供的類型,而不會引發異常。

0

這應該有效。

action is IEnumerable; 
+0

我認爲更多的解釋或更完善的代碼會得到一些選票。 – Argalatyr

2

如果您只是需要測試某個對象是否屬於某個類型,則使用is。如果您需要使用該對象使用as後使運行時必須只做投一次:

IEnumerable e = action as IEnumerable 

if(null != e) 
{ 
    // Use e. 
} 
0

試試這個

if(action is IENumerable) 
{ 
    //do some stuff 
} 

心連心

相關問題