3

共通のスーパー クラスを共有しない複数の「ジェネリック」オブジェクトを (たとえば、リストで) 収集する方法はありますか? もしそうなら、どうすれば共通のプロパティにアクセスできますか?

例えば:

class MyObject<T>
{
   public T Value { get; set; }
   public string Name { get; set; }

   public MyObject(string name, T value)
   {
      Name = name;
      Value = value;
   }
}

var fst = new MyObject<int>("fst", 42);
var snd = new MyObject<bool>("snd", true);

List<MyObject<?>> list = new List<MyObject<?>>(){fst, snd};

foreach (MyObject<?> o in list)
   Console.WriteLine(o.Name);

明らかに、これは疑似コードであり、機能しません。

また、.Value プロパティにアクセスする必要もありません (タイプ セーフではないため)。

編集:これについて考えてきたので、これにサブクラスを使用することが可能です。ただし、それは、新しい型ごとに新しいサブクラスを作成する必要があることを意味すると思います。


@ Grzenio はい、それはまさに私の質問に答えました。もちろん、共有インターフェイス全体を複製する必要がありますが、それは大きな問題ではありません。そう思ったはずなのに…

@akuアヒル のタイピングについてはあなたが正しいです。完全にランダムな 2 種類のオブジェクトにアクセスできるとは思いません。

しかし、汎用オブジェクトは、パラメータ化された型を除いてまったく同じであるため、ある種の共通インターフェースを共有すると思いました。どうやら、これは自動的には当てはまりません。

4

3 に答える 3

7

MyObject は MyObject の基底クラスではないため、C# では可能ではないと思います。私が通常行うことは、インターフェイス(ジェネリックではなく「通常の」インターフェイス)を定義し、 MyObject にそのインターフェイスを実装させることです。

interface INamedObject
{
    string Name {get;}
}

そして、インターフェースを使用できます:

List<INamedObject> list = new List<INamedObject>(){fst, snd};

foreach (INamedObject o in list)
   Console.WriteLine(o.Name);

それはあなたの質問に答えましたか?

于 2008-09-09T11:13:54.483 に答える
3

C# はダック タイピングをサポートしていません。インターフェイスと継承の 2 つの選択肢があります。そうしないと、異なる種類のオブジェクトの同様のプロパティにアクセスできません。

于 2008-09-09T11:06:50.977 に答える
0

最善の方法は、共通の基本クラスを追加することです。それ以外の場合は、リフレクションにフォールバックできます。

于 2008-09-09T11:24:03.883 に答える