2011-03-11 12 views
47

Esto funciona bien:¿Cómo comprobar si el objeto es una matriz de cierto tipo?

var expectedType = typeof(string); 
object value = "..."; 
if (value.GetType().IsAssignableFrom(expectedType)) 
{ 
    ... 
} 

Pero, ¿cómo puedo comprobar si el valor es una matriz de cadenas sin establecer expectedType-typeof(string[])? Quiero hacer algo como:

var expectedType = typeof(string); 
object value = new[] {"...", "---"}; 
if (value.GetType().IsArrayOf(expectedType)) // <--- 
{ 
    ... 
} 

¿Esto es posible?

+1

¿Desea saber si el objeto se declaró como una cadena []. o si un objeto [] contiene solo instancias de un cierto tipo? –

Respuesta

81

Utilice Type.IsArray y Type.GetElementType() para verificar el tipo de elemento de una matriz.

Type valueType = value.GetType(); 
if (valueType.IsArray && expectedType.IsAssignableFrom(valueType.GetElementType()) 
{ 
... 
} 

Cuidado con el Type.IsAssignableFrom(). Si desea verificar el tipo para una coincidencia exacta, debe verificar la igualdad (typeA == typeB). Si desea comprobar si un determinado tipo es el tipo en sí o una subclase (o una interfaz), entonces debería usar Type.IsAssignableFrom():

typeof(BaseClass).IsAssignableFrom(typeof(ExpectedSubclass)) 
-1

¿Realmente necesita saber el tipo de la matriz? ¿O solo necesitas que los elementos sean de cierto tipo?

En este último caso, sólo tiene que filtrar sólo los elementos que coinciden con lo que desea:

string[] strings = array.OfType<string>(); 
15

Usted puede utilizar métodos de extensión (no es que usted tiene que sino que la hace más legible):

public static class TypeExtensions 
{ 
    public static bool IsArrayOf<T>(this Type type) 
    { 
     return type == typeof (T[]); 
    } 
} 

y luego usar:

Console.WriteLine(new string[0].GetType().IsArrayOf<string>()); 
3
value.GetType().GetElementType() == typeof(string) 

como una bonificación adicional (pero no estoy 100% seguro. Este es el código que utilizo ...)

var ienum = value.GetType().GetInterface("IEnumerable`1"); 

if (ienum != null) { 
    var baseTypeForIEnum = ienum.GetGenericArguments()[0] 
} 

con este se puede buscar la lista, IEnumerable ... y obtener el T.

+15

Esa es una cadena de magia arriesgada allí –

5

El más bonito y más segura manera de hacerlo que encontró está utilizando MakeArrayType:

var expectedType = typeof(string); 
object value = new[] {"...", "---"}; 
if (value.GetType() == expectedType.MakeArrayType()) 
{ 
    ... 
} 
Cuestiones relacionadas