7

1..N ジェネリック型パラメーターを取る一連のメソッドを作成する必要があります。たとえば、次のようになります。

int Foo<T1>();
int Foo<T1,T2>();
int Foo<T1,T2,T3>();
...
int Foo<T1,T2,T3...TN>();

内部Foo()では、タイプごとに何かをしたいと思います。

int Foo<T1,T2,T3>() {
    this.data = new byte[3]; // allocate 1 array slot per type
}

のすべてのバリエーションを編集しないように、これをパラメータ化する方法はありますかFoo()?

int Foo<T1,T2,T3>() {
    this.data = new byte[_NUMBER_OF_GENERIC_PARAMETERS];
}

理想的には、型の配列またはコレクションも取得できるようにしたいと考えています。

int Foo<T1,T2,T3>() {
    this.data = new byte[_NUMBER_OF_GENERIC_PARAMETERS];

    // can do this
    Type [] types = new Type[] { T1, T2, T3 };
    // but would rather do this
    Type [] types = _ARRAY_OR_COLLECTION_OF_THE_GENERIC_PARAMETERS;
}
4

4 に答える 4

8

MethodInfo.GetGenericArguments配列から現​​在のジェネリック パラメータとその番号を読み取ることができます。

MethodInfomethod を使用して、現在のメソッドの をMethodBase.GetCurrentMethod取得できます。

C# と CLI は可変長のジェネリック パラメーター リストをサポートしていないため、異なる数のジェネリック パラメーターを使用して、メソッドのジェネリック オーバーロードをいくつか指定する必要があることに注意してください。

したがって、3 つのジェネリック パラメーターを持つメソッドのコード サンプルは、次のように記述できます。

int Foo<T1,T2,T3>() {
    MethodInfo mInfo = (MethodInfo)MethodBase.GetCurrentMethod();
    Type[] types = mInfo.GetGenericArguments();

    this.data = new byte[types.Length];
}
于 2013-08-04T16:44:55.800 に答える
2

1) リフレクション経由でテンプレート引数の数を取得できます: http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getcurrentmethod.aspx。このようにして、各 Foo に共通の実装を持つことができます。各 Foo で、次のように呼び出すことができます。

FooImpl();

(「GetCurrentMethod」に関して) 唯一の違いは、前のメソッドのメソッド情報を取得する必要があることです。

StackTrace stackTrace = new StackTrace();
MethodBase methodBase = stackTrace.GetFrame(1).GetMethod();

2) 実行時にすべての Foo バージョンを生成できます。すべてが FooImpl のみを呼び出す同じ実装を共有します。実行時のメソッドの生成に関する詳細: 実行時に動的に関数を作成するおよびここ: http://msdn.microsoft.com/en-us/library/exczf7b9.aspx

于 2013-08-04T16:49:44.730 に答える
0

いいえ、必要に応じて Type パラメーターを使用することはできません。しかし、 Tupleのようなものを使用できます。ジェネリックをラップできます。ただし、TypeParamter 自体は使用できません。

于 2013-08-04T16:42:04.837 に答える