Skeet氏が述べたように、クラスタイプに依存しないアイテムを非ジェネリッククラスまたはインターフェイスにプルすることは、一般的に実用的な方法です。それ以外の場合は、次のようなT
パラメーター型を持つジェネリックメソッドにオブジェクトを渡すことができるジェネリックシングルトン(Reflectionを介して生成される)を返す型パラメーターを持つジェネリックメソッドを作成することをお勧めします。このようなメソッドは、そのタイプのインスタンスを処理するために何度使用されたとしても、特定のタイプに対して1回だけReflectionを使用する必要があります。U
T:A<U>
T
デリゲートはクローズドジェネリックでのみ使用できるため、おそらくいくつかのジェネリックインターフェイスを定義する必要があります。
//ユーザーコードは、これらのインターフェースの1つの実装をディスパッチに提供します
//オブジェクト。適切なタイプで「Act」メソッドを呼び出します
インターフェイスIActUponGenericA
{{
void Act <T>(A <T> param);
}
インターフェイスIActUponGenericA<PT1>
{{
void Act <T>(A <T> param、PT1 extraParam1);
}
インターフェイスIActUponGenericA<PT1、PT2>
{{
void Act <T>(A <T> param、PT1 extraParam1、PT2 extraParam2);
}
//ディスパッチオブジェクト自体がこのインターフェースを実装します:
インターフェイスIWrapActUponGenericA<T>
{{
void CallAction(IActUponGenericA act、T param);
void CallAction <PT1>(IActUponGenericA <PT1> act、T param、PT1 extraParam1);
void CallAction <PT1、PT2>(IActUponGenericA <PT1、PT2> act、T param、
PT1 extraParam1、PT2 extraParam2);
}
次に、(一部T
を実装する)パラメータータイプを指定すると、Reflectionベースのメソッドコードは、インターフェイスを実装するシングルトンを生成します。その実装は、タイプのオブジェクトとの実装を取り、その実装のメソッドを呼び出すことができます。A<Q>
Q
IWrapActUponGenericA<T>
T
IActUponGenericA
Act<Q>
このアプローチは、を使用するよりも複雑になりdynamic
、パフォーマンスが向上する場合としない場合があります。ただし、それができないいくつかの状況に対処することdynamic
はできます。