Какой самый быстрый способ проверить, является ли объект IEnumerable?

Есть ли быстрый способ узнать, поддерживает ли содержимое переменной object IEnumerable? В частности, я использую XPathEvaluate() из System.Xml.XPath, который может возвращать объект, который может содержать bool, double, строку или 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(), но я думал, что спрошу, есть ли более быстрый/простой способ.

Ответ 1

Вы ищете 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

Используйте is оператор:

if(action is IEnumerable)

Это то, что он делает:

An выражение выражает true, если предоставленное выражение не является нулевым, а предоставленный объект может быть добавлен к предоставленному типу, не вызывая исключения.

Ответ 3

Если вам просто нужно проверить, имеет ли объект тип, используйте is. Если вам нужно использовать этот объект после использования as, чтобы среда выполнения выполняла только один раз:

IEnumerable e = action as IEnumerable

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

Ответ 4

Это должно работать.

    action is IEnumerable;

Ответ 5

попробуйте этот

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

HTH