2011-07-18 8 views
10

object変数の内容がIEnumerableをサポートしているかどうかを簡単に確認できますか?具体的に私は「An object that can contain a bool, a double, a string, or an IEnumerable.オブジェクトがIEnumerableであるかどうかをテストする最も簡単な方法は何ですか?

だから、実行した後に返すことができSystem.Xml.XPath、からXPathEvaluate()を使用しています:

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) 
    { 
    ... 
    } 
} 

あなたがis operatorを使用if(enumerable != null && !(action is string))

+2

が実際 'その文字列に注意してみてください'' IEnumerable'も実装しています。特に、あなたのオブジェクトが文字列( 'XPathEvaluate'の戻り値のようなもの)で、実際に_collection_を持っているかどうかを知りたい場合、' if(action is IEnumerable &&!(action is string)) ' – Alex

+0

@Alex非常に真実。 – Jamiec

2

にそのチェックを拡張したいかもしれませんのでstringも、IEnumerableを実装することに注意してください:

if(action is IEnumerable) 

これは、それが何をするかです:

is式は、指定されたexpressio nはnullではなく、提供されたオブジェクトは、例外がスローされることなく提供された型にキャストできます。

0

これは機能するはずです。

+0

私はもう少し説明またはより完全に開発されたコードはあなたにいくつかの投票を得たと思います。 – Argalatyr

2

オブジェクトが型かどうかをテストする必要がある場合は、isを使用してください。あなたは、ランタイムは一度だけキャストを行う必要があるように使用as後にそのオブジェクトを使用する必要がある場合:

IEnumerable e = action as IEnumerable 

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

することは、この1つの

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

HTH

関連する問題