2011-07-18 26 views
10

¿Hay una forma rápida de averiguar si el contenido de una variable object admite IEnumerable? Específicamente estoy usando XPathEvaluate() de System.Xml.XPath, que puede volver "An object that can contain a bool, a double, a string, or an IEnumerable."¿Cuál es la forma más rápida de probar si un objeto es IEnumerable?

Así que después de la ejecución:

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)? 

que podría hurgar con action.GetType().GetInterface(), pero pensé que pediría si hay una manera más rápida/más fácil.

Respuesta

22

Usted está buscando el operador is:

if(action is IEnumerable) 

o mejor aún, el operador as.

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

Tenga en cuenta que string también implementa IEnumerable, por lo que podría extender el cheque a if(enumerable != null && !(action is string))

+2

Sé consciente del hecho de que 'string 'implementa' IEnumerable' también. Especialmente cuando su objeto puede ser una cadena (como el valor de retorno de 'XPathEvaluate') y realmente quiere saber si tiene una _collection_, puede usar una verificación extendida como' if (la acción es IEnumerable &&! (Action is string)) ' – Alex

+0

@Alex muy cierto. – Jamiec

2

Uso del is operator:

if(action is IEnumerable) 

Esto es lo que hace:

Una expresión is es válida si la expresión proporcionada n no es nulo, y el objeto proporcionado puede convertirse al tipo proporcionado sin causar una excepción.

0

Esto debería funcionar.

action is IEnumerable; 
+0

Creo que un poco más de explicación o un código más completo le habría dado algunos votos. – Argalatyr

2

Si sólo tiene que probar si un objeto es de un tipo a continuación, utilizar is. Si es necesario utilizar ese objeto después de su uso as de modo que el tiempo de ejecución sólo se tiene que hacer el molde una vez:

IEnumerable e = action as IEnumerable 

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

prueba este

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

hth

Cuestiones relacionadas