3

私は型パラメータを取るオブジェクトを持っています-それを呼び出しますObject<T>-そして、以下のように、異なる型パラメータを持つ多くのオブジェクトをリストに追加できる必要があります:

var obj1 = new Object<SomeType>();
var obj2 = new Object<SomeOtherType>();

var list = new List<Object<WhatGoesHere>{ obj1, obj2 };

さまざまなオブジェクトのリストである場合はインターフェイスを使用できることはわかっていますが、それはさまざまな型パラメーターを持つオブジェクトのリストには当てはまらないようです。

4

1 に答える 1

4

通常は、インターフェイスを作成するのが最善です。ジェネリック引数を知らなくても使用できるように、ほとんどのジェネリック クラスにインターフェイスがあります。

interface IFoo
{
  object UntypedBlah(object arg);
}

class Foo<T> : IFoo
{
  object UntypedBlah(object arg)
  {
    return Blah((T)arg);
  }

  T Blah(T arg)
  {
    //...
  }

}

List<IFoo> foos = new List<IFoo>();
foos.Add(new Foo<int>());
foos.Add(new Foo<string>());
  • 共変にすることもできます。(インターフェイスには、共変のジェネリック引数があります。これが意味があるかどうかは、インターフェイスに必要なメンバーによって異なります。)
  • 「型指定されていない」メンバーの代わりに、同じ名前を付けて明示的に実装することができます。しかし、インターフェースやクラスの階層が複雑な場合に問題が発生することがあります。その場合は、それらに別の名前を付ける方が簡単な場合があります。
于 2013-07-02T05:45:32.760 に答える