3 Stimmen

Zugriff auf nicht-generische Mitglieder eines generischen Objekts

Gibt es eine Möglichkeit, mehrere "generische" Objekte, die keine gemeinsame Oberklasse haben, zu sammeln (z. B. in einer Liste)? Wenn ja, wie kann ich auf ihre gemeinsamen Eigenschaften zugreifen?

Zum Beispiel:

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);

Das ist natürlich nur Pseudocode, der nicht funktioniert.

Ich brauche auch nicht auf die Eigenschaft .Value zuzugreifen (da dies nicht typsicher wäre).

EDITAR: Nun, da ich darüber nachgedacht habe, wäre es möglich, Unterklassen für diese zu verwenden. Allerdings denke ich, das würde bedeuten, dass ich eine neue Unterklasse für jeden neuen Typ schreiben müsste.


@ Grzenio Ja, genau das hat meine Frage beantwortet. Natürlich muss ich jetzt die gesamte gemeinsame Schnittstelle duplizieren, aber das ist kein großes Problem. Daran hätte ich denken sollen...

@ aku Sie haben Recht, was das Tippen von Enten betrifft. Ich würde nicht erwarten, dass zwei völlig zufällige Arten von Objekten zugänglich sind.

Ich dachte aber, dass generische Objekte eine Art gemeinsame Schnittstelle haben, da sie abgesehen von dem Typ, den sie parametrisieren, genau gleich sind. Offenbar ist dies nicht automatisch der Fall.

7voto

Grzenio Punkte 34566

Ich glaube nicht, dass dies in C# möglich ist, da MyObject keine Basisklasse von MyObject ist. Normalerweise definiere ich eine Schnittstelle (eine "normale", nicht generische) und lasse MyObject diese Schnittstelle implementieren, z. B.

interface INamedObject
{
    string Name {get;}
}

und dann können Sie die Schnittstelle verwenden:

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

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

Ist Ihre Frage damit beantwortet?

3voto

aku Punkte 118808

C# unterstützt die Duck-Typisierung nicht. Sie haben 2 Möglichkeiten: Schnittstellen und Vererbung, sonst können Sie nicht auf ähnliche Eigenschaften von verschiedenen Arten von Objekten zugreifen.

0voto

Motti Punkte 104854

Am besten wäre es, eine gemeinsame Basisklasse hinzuzufügen, ansonsten kann man auf Reflection zurückgreifen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X