5

我需要为具有指定数量索引的基本类型的数组创建一个Type实例。基本上我需要像下面这样的方法,我可以调用......

public Type GetArrayOfType(Type baseType, int numOfIndexes)
{
    return /* magic does here */
}

因此调用该函数将给出以下结果......

GetTypeArray(typeof(bool), 1) == typeof(bool[])
GetTypeArray(typeof(bool), 2) == typeof(bool[,])
GetTypeArray(typeof(bool), 3) == typeof(bool[,,])

我能想出的唯一解决方案是以下...

public Type GetArrayOfType(Type baseType, int numOfIndexes)
{
    List<int> indexes = new List<int>();
    for(int i=0; i<numOfIndexes; i++)
        indexes.Add(1);

    return Array.CreateInstance(baseType, indexes.ToArray()).GetType();
}

这确实有效,但必须创建所需类型的实例才能调用GetType()似乎并不理想。必须有一种方法可以在不创建实例的情况下生成类型。或者有吗?

4

1 回答 1

9

你可以这样做:

public Type GetArrayOfType(Type baseType, int numOfIndexes) {
    return numOfIndexes == 1 ? baseType.MakeArrayType() : baseType.MakeArrayType(numOfIndexes);
}

有一个小技巧:虽然你可以传递1MakeArrayType(int)但它产生的类型与返回的类型不同。这是文档的摘录:MakeArrayType

公共语言运行时区分向量(即始终从零开始的一维数组)和多维数组。始终只有一维的向量与恰好只有一维的多维数组不同。您不能使用此方法重载来创建向量类型;如果rank1,则此方法重载返回恰好具有一维的多维数组类型。使用MakeArrayType()方法重载来创建向量类型。

于 2012-12-04T03:02:26.450 回答