我需要为具有指定索引数的基类型数组创建 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()似乎并不理想。必须有一种方法可以在不创建实例的情况下生成类型。或者有吗?
答案 0 :(得分:9)
你可以这样做:
public Type GetArrayOfType(Type baseType, int numOfIndexes) {
return numOfIndexes == 1 ? baseType.MakeArrayType() : baseType.MakeArrayType(numOfIndexes);
}
有一个小技巧:尽管你可以将1
传递给MakeArrayType(int)
,但它将要生成的类型不与返回的类型相同MakeArrayType
。以下是文档的摘录:
公共语言运行库区分向量(即,始终从零开始的一维数组)和多维数组。始终只有一个维度的向量与恰好只有一个维度的多维数组不同。您不能使用此方法重载来创建矢量类型;如果
rank
为1
,则此方法重载将返回恰好具有一个维度的多维数组类型。使用MakeArrayType()
方法重载来创建矢量类型。