2010-11-07 10 views

Respuesta

37

Verificar typeof(IEnumerable).IsAssignableFrom(type).

Cada tipo de colección, incluidas las matrices y IEnumerable<T>, implementa IEnumerable.

+12

Gracias - que tenía que excluir 'string', ya que surgió como una matriz de' Char' y yo no quiero eso. :) –

+0

Sí; Me olvide de eso. – SLaks

+0

También excluye System.Xml.XmlText así como otros descendientes de System.Xml.XmlNode. –

-4

Simple. La cosa más fácil de hacer es la siguiente:

IList<T> listTest = null; 

try{ 
    listTest = ((IList<T>)yourObject); 
} 
catch(Exception listException) 
{ 
    //your object doesn't support IList and is not of type List<T> 
} 

IEnumerable<T> enumerableTest = null; 

try{ 
    enumerableTest = ((IEnumerable<T>)yourObject); 
} 
catch(Exception enumerableException) 
{ 
    //your object doesn't suport IEnumerable<T>; 
} 

================================== ================

También puede probar esto que no involucra múltiples bloques try/catch. Es mejor si puede evitar el uso de estos porque cada condición es evaluada por el tiempo de ejecución durante el tiempo de ejecución ... es un código incorrecto (aunque a veces no hay forma de evitarlo).

Type t = yourObject.GetType(); 

if(t is typeof(List<OjbectType>)) //object type is string, decimal, whatever... 
{ 
    // t is of type List<ObjectType>... 
} 
else if(t is typeof(IEnumerable<ObjectType>) 
{ 
    // t is of type IEnumerable<ObjectType>... 
} 
else 
{ 
    // t is some other type. 
    // use reflection to find it. 
} 
+2

En lugar de hacer 'listTest = ((IList ) yourObject);' y atrapar una excepción, puede hacer 'yourObject is IList ' – Gabe

+2

¡Qué desorden! Al menos cuatro cosas están mal aquí. (1) Capturar excepciones en lugar de usar 'is' o' as'. (2) Captura 'Exception' en lugar de' InvalidCastException'. (3) En el segundo bloque de código, pensar C# 'is' funciona de la misma manera que VB6' Is' - en realidad '==' es el operador correcto, pero seguirá fallando porque (4) 'GetType()' siempre devuelve una clase concreta, nunca una interfaz como 'IEnumerable ' –

0
if (objType.IsArray || objType.IsGenericType) 
{ 

} 
+1

'objType.IsGenericType' devolvería' true', si es 'int?' y 'Nullable ' no es 'IEnumerable' o' Array' –

+0

@MatthiasBurger Lo probé devolvió falso –

+0

@AlaMusleh ¿Devuelve verdadero para int? –

Cuestiones relacionadas