2016-07-29 20 views
1

Ich habe die Antwort bei der Suche nicht gefunden.C# Liste der verschiedenen Klassen

Ich brauche eine Liste, die verschiedene Klassen enthält, jede von ihnen inhärent von einer Basisklasse BaseA, aber jeder von ihnen wird Eigenschaften haben, die andere nicht haben, oder einige, die die gleiche Klasse verwenden.

public class BaseA 
{ 
    public int ID = 0; 
} 

public class AA : BaseA 
{ 
    public int AID = 0; 
} 

public class AB : BaseA 
{ 
    public int BID = 1; 
} 

public class AC : BaseA 
{ 
    public int CID = 0; 
} 

Nun ist die Frage, wie kann ich eine einzige Liste erhalten, die Klasse AA, AB und AC und den Editor denken enthalten kann ich werde nicht nur ich mit einem von ihnen zu arbeiten.

Ich habe versucht, die List<BaseA> gemacht, aber dies wird nur die BassA Eigenschaften offen legen, und was ich brauche, ist in der Lage zu tun List[0].AID wo es verstehen wird, was AID bedeutet, wenn ich über die AA-Klasse spreche.

Ich gehe vielleicht alles falsch, kann mir jemand in die richtige Richtung zeigen?

+2

Es klingt, als ob Sie einen Designfehler haben.Gehen Sie einen Schritt zurück und entscheiden Sie, ob Sie eine gemeinsame Liste für diese Klassen haben sollten – Default

+0

Sie mögen Recht haben, aber die gemeinsame Liste für diese Klassen ist eine bessere Lösung als 9 Listen zu durchlaufen. – ImtehQ

+0

Vielleicht nicht, wenn Sie 9 verschiedene Möglichkeiten haben müssen, die Daten aus dieser einzelnen Liste zu extrahieren. – Default

Antwort

0

Sie können versuchen, mit Linq hierfür:

List<BaseA> list = ... 

    var result = list 
    .OfType<AA>() // Filter out AA instances only 
    .ElementAt(0) // or just First(); 
    .AID; 
0

Sie nach Gießen suchen, vielleicht?

var list = new List<BaseA> 
{ 
    new AA(), 
    new AB(), 
    new AC(), 
} 

var aa = list[0] as AA; 

if (aa != null) 
{ 
    var id = aa.AID; 
} 
0

Brauchte eine Variable oder Eigenschaft in der Basisklasse zu platzieren, die speichern, welche Art es dann eine Guss versuchen wird (Liste [0] als AA), und wenn es nicht null Verwendung zurückkehrt das neu gegossene Objekt um die gewünschte Variable auszuwählen.

Die eigentliche Frage ist, warum die abgeleiteten Klassen ihre eigene ID-Variable benötigen, besonders wenn Sie sie in einer Liste basierend auf dieser ID werfen.

+0

Die ID und AID oder BID ist nur ein Beispiel;) – ImtehQ

0

Es gibt eine Möglichkeit, dies einfach und elegant zu tun. Geben Sie eine abstrakte Methode in der Basisklasse (oder mehrere davon):

public abstract void AID(parameters); 

Und in jeder der Klassen diese Methode überschreiben, eine bestimmte Sache zu dieser Klasse mit Bezug zu tun.

Oder Sie können einen alternativen Weg nehmen; für jedes Objekt überprüfen, ob es die Art von jeder der Klassen ist:

if(obj is AA){ 
//do AA stuff 
} 
if(obj is AB){ 
//do AB stuff 
} 
if(obj is AC){ 
//do AC stuff 
} 
0

paar Möglichkeiten, können Sie versuchen,

  1. mit Ihrem Ansatz gehen, werfen Sie das Element in der Liste ((AA)List[0]).AID.

Sie sollten einige Kenntnisse über das Objekt haben, dass es zu AA um gehört die Eigenschaft AID auf sie zugreifen zu können.

wenn Ihre Anforderung an die Nutzung beschränkt ist, die Sie beschrieben haben, dann würde ich vorschlagen, dass Sie etwas in ähnlichen Linien versehen unten

class BaseA 
{ 
    public string ObjectType { get; set; } //enum would be a good choice. 

    public int ID { get; set; } 
      (or) 
    public Dictionary<string,int> AllProperties { get; set; } 
} 

Mit diesem Ansatz können Sie die Art der Klasse überprüfen und Rufen Sie entsprechende Eigenschaft darauf an.

+0

Eine Besetzung wird nicht funktionieren, da ich es um viele Male herumwerfen musste. Ich habe auch den enum Weg versucht, um herauszufinden, welcher Typ es vor etwas Code war, aber ich dachte, dass es einen besseren Weg geben muss, es zu tun. – ImtehQ