2012-01-10 12 views
5

¿Cómo puedo obtener el tipo de los elementos más internos de una matriz multidimensional?C# Obtenga el tipo de una matriz multidimensional

var qq = new int[2,3]{{1,2,3}, {1,2,4}}; 
var t = qq.GetType().ToString();//is "System.Int32[,]" 
var t2 = ??; // should be "System.Int32" 

Me gustaría obtener el tipo de elemento más interno independientemente de la cantidad de dimensiones de la matriz (Rango).

+0

Algo a lo largo de las líneas de var qq = new int [2,3] {{1, 2, 3}, {1, 2, 4}}; var bounds = Enumerable.Range (0, qq.Rank) .Seleccione (r => qq.GetLowerBound (r)). ToArray(); var fst = qq.GetValue (límites); pero es defectuoso y complicado. –

Respuesta

13

Uso GetElementType():

var t2 = qq.GetType().GetElementType().ToString(); 
+4

+1 es posible que también desee verificar con [Tipo HasElement] (http://msdn.microsoft.com/en-us/library/system.type.haselementtype.aspx) primero –

+0

Sweet. Pensé que el tipo "Tipo" puede tener algo útil, pero no lo pude encontrar. –

2

Cuando se encontró que hay una falta de métodos fuera de la caja de lo que necesita, siempre puede escribir sus propios métodos de extensión.

public static Type GetEssenceType(this Type node) { 
    for(Type head=node, next; ; node=next) 
     if(null==(next=node.GetElementType())) 
      return node!=head?node:null; 
} 

Devuelve el más interior elemento de tipo (que se llama el tipo esencia) si el tipo determinado (llamado node en el código) era un tipo que tiene elemento de tipo; de lo contrario, null.


Editar:

Type tiene un método interno hace lo similar:

internal virtual Type GetRootElementType() 
{ 
    Type elementType = this; 
    while (elementType.HasElementType) 
    { 
     elementType = elementType.GetElementType(); 
    } 
    return elementType; 
} 

Se puede crear un delegado o usarlo a través de la reflexión:

var bindingAttr=BindingFlags.Instance|BindingFlags.NonPublic; 
var method=typeof(Type).GetMethod("GetRootElementType", bindingAttr); 
var rootElementType=(Type)method.Invoke(givenType, null); 

Tenga en cuenta que GetRootElementType devuelve el tipo dado si no tiene el tipo de elemento.

+0

+1 porque funciona. Pero encuentro tales bucles (innecesariamente) difíciles de leer. Lo mismo para C++, como las comparaciones nulas de LHS. –

Cuestiones relacionadas