0

私はクラスがあると言います

public abstract class A<T>
{
     public T GetT{get;}

     public ISomeInterface AMethod{get;}
}

次に、別のクラスに他のメソッドがあり、オブジェクトを取得し、それがタイプであることを確認したいA<> ので、タイプを取得しTてメソッドを呼び出しますAMethod。だから私はこれをやっています:

if (theObject.GetType().GetGenericTypeDefinition() == typeof (A<>))
{
    Type TType = theObject.GetType().GetGenericArguments()[0];            
    dynamic dynamicObject= theObject;
    ISomeInterface filter = dynamicObject.AMethod;
    //...some other stuff using TType
} 

実行時にTTypeまたはを使用して、またはジェネリック型の定義を使用して変数の型を宣言できないため、動的オブジェクトを使用せずにこれを行う方法はありますか?A<>

4

2 に答える 2

4

可能であれば、すべての非ジェネリックなものを抽象的な非ジェネリックの基本クラスに入れます。

public abstract class A
{
     public ISomeInterface AMethod{get;}
}

public abstract class A<T> : A
{
     public T GetT{get;}
}

次に、次を使用できます。

A foo = theObject as A;
if (foo != null)
{
    ISomeInterface filter = foo.AMethod;
}
于 2012-05-31T15:22:08.013 に答える
1

Skeet氏が述べたように、クラスタイプに依存しないアイテムを非ジェネリッククラスまたはインターフェイスにプルすることは、一般的に実用的な方法です。それ以外の場合は、次のようなTパラメーター型を持つジェネリックメソッドにオブジェクトを渡すことができるジェネリックシングルトン(Reflectionを介して生成される)を返す型パラメーターを持つジェネリックメソッドを作成することをお勧めします。このようなメソッドは、そのタイプのインスタンスを処理するために何度使用されたとしても、特定のタイプに対して1回だけReflectionを使用する必要があります。UT: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>QIWrapActUponGenericA<T>TIActUponGenericAAct<Q>

このアプローチは、を使用するよりも複雑になりdynamic、パフォーマンスが向上する場合としない場合があります。ただし、それができないいくつかの状況に対処することdynamicはできます。

于 2012-05-31T16:30:25.000 に答える