Frage

Gibt es eine Möglichkeit zum Sammeln (z.B.in einer Liste) mehrere „generische“ Objekte, die keine gemeinsame Superklasse haben?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);

Offensichtlich ist das Pseudocode, das funktioniert nicht.

Außerdem muss ich nicht auf die Eigenschaft .Value zugreifen (da dies nicht typsicher wäre).

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


@GrzenioJa, das hat genau 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...

@akuMit dem Ententippen hast du recht.Ich würde nicht erwarten, dass zwei völlig zufällige Arten von Objekten zugänglich sind.

Aber ich dachte, generische Objekte würden eine Art gemeinsame Schnittstelle haben, da sie bis auf den Typ, durch den sie parametrisiert werden, genau gleich sind.Offenbar ist dies nicht automatisch der Fall.

War es hilfreich?

Lösung

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 veranlasse MyObject, diese Schnittstelle zu 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);

Hat es Ihre Frage beantwortet?

Andere Tipps

C# unterstützt kein Duck-Typing.Sie haben zwei Möglichkeiten:Schnittstellen und Vererbung, sonst können Sie nicht auf ähnliche Eigenschaften verschiedener Objekttypen zugreifen.

Der beste Weg wäre, eine gemeinsame Basisklasse hinzuzufügen, andernfalls können Sie auf die Reflexion zurückgreifen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top