测试对象是否为IEnumerable的最快方法是什么?

Chr*_*ham 12 c# .net-3.5

有没有快速的方法来确定object变量的内容是否支持IEnumerable?具体来说我使用XPathEvaluate()从System.Xml.XPath,它可以返回" 它可以包含一个bool,双,字符串,或一个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)?
Run Code Online (Sandbox Code Playgroud)

我可以随便找一下action.GetType().GetInterface(),但我想我会问是否有更快/更简单的方法.

Jam*_*iec 25

您正在寻找is运营商:

if(action is IEnumerable)
Run Code Online (Sandbox Code Playgroud)

甚至更好,as运营商.

IEnumerable enumerable = (action as IEnumerable);
if(enumerable != null)
{
  foreach(var item in enumerable)
  {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,它string也实现了IEnumerable,因此您可能希望将该检查扩展到if(enumerable != null && !(action is string))

  • 请注意`string`也实现了`IEnumerable`这一事实.特别是当你的对象可能是一个字符串(比如`XPathEvaluate`的返回值)并且你真的想知道你是否有_collection_时,你可能会使用像`if(action is IEnumerable &&!(action is string))这样的扩展检查. (3认同)