如何获取描述基类型数组的Type?

时间:2012-12-04 02:57:05

标签: c# .net reflection types

我需要为具有指定索引数的基类型数组创建 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()似乎并不理想。必须有一种方法可以在不创建实例的情况下生成类型。或者有吗?

1 个答案:

答案 0 :(得分:9)

你可以这样做:

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

有一个小技巧:尽管你可以将1传递给MakeArrayType(int),但它将要生成的类型与返回的类型相同MakeArrayType。以下是文档的摘录:

  

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