1

ジェネリッククラスがあるとしましょう:

public class MyGenericClass<T> { 
  ...
}

このクラスの中に、別のジェネリックと対話できるメソッドが必要です。これは、ジェネリック型Tまたは次のようなスーパークラスのいずれかTです。

public void DoSomething<T1>(List<T1> things) 
  where T : T1 // of course this won't compile
{
  ...
}

これをどのように行いますか?

4

2 に答える 2

5

あなたはできません、私は恐れています。最も近いのは、非ジェネリッククラスのメソッド(おそらく拡張メソッド)です。

public static MyGenericClassExtensions
{
    public static void DoSomething<T, T1>(this MyGenericClass<T> @this,
                                          List<T1> things)
        where T : T1
    {
        ...
    }
}

両方の型パラメーターが同時に導入されるため、これで問題ありません。

もちろん、別の方法として、メソッドをインスタンスメソッドとしてMyGenericClass<T>制約なしで保持し、実行時に制約を確認することもできます。これは、コンパイル時の安全性とジェネリックスの一般的な宣言型の性質の観点からは不幸ですが、最終的にはうまくいく可能性があります。

于 2012-12-09T08:01:03.430 に答える
0

@JonSkeetの答えは、いつものように的を射ていますが、コードに混乱を引き起こすことなく、これを行う別の方法を見つけました。次のように、別のジェネリッククラスを作成し、既存のクラスを変更しました。

public class MyGenericClass<T, TBase> 
  where T : TBase
{ 
  public void DoSomething(List<TBase> things) 
  {
    ...
  }
}

public class MyGenericClass<T> : MyGenericClass<T, T>
{
  ...
}

このようにして、下位互換性を維持しながら、必要な機能を取得できます。つまり、元の単一タイプのジェネリックを使用している既存のコードはすべて引き続き機能します。

于 2012-12-09T09:19:22.550 に答える