2008-09-09 14 views
2

Gibt es eine Möglichkeit, mehrere generische Objekte zu sammeln (z. B. in einer Liste), die keine gemeinsame Superklasse haben? Wenn ja, wie kann ich auf ihre gemeinsamen Eigenschaften zugreifen?Zugriff auf nicht-generische Elemente eines generischen Objekts

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 diese Pseudo-Code, das funktioniert nicht.

Auch muss ich nicht auf die .Value-Eigenschaft zugreifen (da das nicht typsicher wäre).

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


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

@aku Sie haben Recht mit der Ente tippen. 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 teilen, da sie genau die gleichen sind, abgesehen von dem Typ, durch den sie parametrisiert werden. Offensichtlich ist dies nicht automatisch der Fall.

Antwort

6

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

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 beantworten?

3

C# unterstützt die Eingabe von Enten nicht. Sie haben zwei Möglichkeiten: Schnittstellen und Vererbung, ansonsten können Sie nicht auf ähnliche Eigenschaften verschiedener Objekttypen zugreifen.

0

Der beste Weg wäre, eine gemeinsame Basisklasse hinzuzufügen, sonst kann man auf Reflexion zurückgreifen.

Verwandte Themen