C#获取多维数组的类型

5

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

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"

我希望能够获取数组内最内层元素类型,而不考虑数组的维数(阶数)。


类似这样的代码: 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); 但它存在漏洞且过于复杂。 - Cristian Diaconescu
2个回答

14

使用 GetElementType() 方法:

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

4
你可以先查看HasElementType,再进行检查。 - Paolo Falabella
太好了。我以为Type类型可能有一些可用的东西,但是找不到它。 - Cristian Diaconescu

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返回该类型本身。

+1 因为它能工作。但我发现这样的 for 循环(不必要地)难以阅读。对于类似 C++ 的 LHS null 比较也是如此。 - Cristian Diaconescu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接