2012-01-10 94 views
5

如何获取多维数组的最内层元素的类型?C#获取多维数组的类型

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" 

我想得到最内层的元素类型,无论数组的维数(Rank)多少。

+0

var qq = new int [2,3] {{1,2,3},{1,2,4}}; var bounds = Enumerable.Range(0,qq.Rank).Select(r => qq.GetLowerBound(r))。ToArray(); var fst = qq.GetValue(bounds); 但它的越野车和复杂。 – 2012-01-10 15:42:37

回答

13

使用GetElementType()

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

+1您可能还想首先与[HasElementType](http://msdn.microsoft.com/en-us/library/system.type.haselementtype.aspx)进行核对。 – 2012-01-10 15:39:58

+0

甜。我认为'Type'类型可能有用,但找不到它。 – 2012-01-10 15:40:55

2

当你发现有缺少的方法把你所需要这个箱子是什么,你总是可以编写自己的扩展方法。

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

它返回最内元素类型(我称为本质型)如果给定类型(在代码命名node)是这样一种类型,具有元素类型;否则,null


编辑:

Type有一个内部的方法完成类似的事情:

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

您可以创建一个委托或通过反射使用它:

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

请注意,GetRootElementType如果它没有元素类型,则返回给定的类型本身。

+0

+1'因为它的作品。但是我发现这样的循环(不必要的)很难阅读。相同的C++ - 如LHS空比较。 – 2013-08-02 09:59:32