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。ドキュメントからの抜粋は次のとおりです。

共通言語ランタイムは、ベクトル(つまり、常にゼロベースの1次元配列)と多次元配列を区別します。常に1つの次元しかないベクトルは、たまたま1つの次元しかない多次元配列と同じではありません。このメソッドのオーバーロードを使用してベクトル型を作成することはできません。の場合、このメソッドのオーバーロードrank1、たまたま1つの次元を持つ多次元配列型を返します。MakeArrayType()メソッドoverloadを使用して、ベクトル型を作成します。

于 2012-12-04T03:02:26.450 に答える