如何获取多维数组的最内层元素的类型?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)多少。
如何获取多维数组的最内层元素的类型?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)多少。
使用GetElementType()
:
var t2 = qq.GetType().GetElementType().ToString();
+1您可能还想首先与[HasElementType](http://msdn.microsoft.com/en-us/library/system.type.haselementtype.aspx)进行核对。 – 2012-01-10 15:39:58
甜。我认为'Type'类型可能有用,但找不到它。 – 2012-01-10 15:40:55
当你发现有缺少的方法把你所需要这个箱子是什么,你总是可以编写自己的扩展方法。
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
如果它没有元素类型,则返回给定的类型本身。
+1'因为它的作品。但是我发现这样的循环(不必要的)很难阅读。相同的C++ - 如LHS空比较。 – 2013-08-02 09:59:32
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