質問
収集する方法はありますか(例:リスト内)共通のスーパークラスを共有しない複数の「汎用」オブジェクト?もしそうなら、どうすればそれらの共通プロパティにアクセスできますか?
例えば:
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 プロパティにアクセスする必要もありません (タイプセーフではないため)。
編集: さて、これについて考えてみましたが、これにはサブクラスを使用することが可能でしょう。ただし、それは新しい型ごとに新しいサブクラスを作成する必要があることを意味すると思います。
@グルゼニオはい、まさに私の質問に答えました。もちろん、共有インターフェイス全体を複製する必要がありますが、それは大きな問題ではありません。それを考えるべきだった...
@アクアヒルタイピングについてはおっしゃるとおりです。完全にランダムな 2 種類のオブジェクトにアクセスできるとは予想しませんでした。
しかし、ジェネリック オブジェクトは、パラメータ化されている型を除けばまったく同じであるため、ある種の共通インターフェイスを共有するだろうと私は考えていました。どうやら、これは自動的には当てはまりません。
解決
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);
あなたの質問の答えになりましたか?
他のヒント
C# はダック タイピングをサポートしていません。選択肢は 2 つあります。そうしないと、さまざまな種類のオブジェクトの同様のプロパティにアクセスできなくなります。
最善の方法は、共通の基本クラスを追加することです。それ以外の場合は、リフレクションに戻ることができます。