2016-07-29 2 views
1

Je n'ai pas trouvé la réponse dans la recherche.C# Liste des différentes classes

J'ai besoin d'une liste qui contient différentes classes, chacune étant inhérente à une classe de base BaseA, mais chacune aura des propriétés que d'autres n'auront pas, ou qui utiliseront la même classe.

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

Maintenant, la question est de savoir comment puis-je obtenir une seule liste qui peut contenir la classe AA, AB et AC et l'éditeur ne pense pas que je suis seulement travailler avec l'un d'entre eux.

J'ai essayé de faire le List<BaseA>, mais cela n'expose que les propriétés de bassA, et ce dont j'ai besoin est de pouvoir faire List[0].AID où il comprendra ce que l'AID signifie si je parle de la classe AA.

Je peux aller tout faux, quelqu'un peut-il me diriger dans la bonne direction?

+2

Il semble que vous ayez un défaut de conception.Revenez en arrière et décidez si vous devriez même avoir une liste partagée pour ces classes – Default

+0

Vous avez peut-être raison, mais la liste partagée pour ces classes est une meilleure solution que les 9 listes à suivre. – ImtehQ

+0

Peut-être pas si vous devez avoir 9 façons différentes d'extraire les données de cette liste unique. – Default

Répondre

0

Vous pouvez essayer d'utiliser Linq pour cela:

List<BaseA> list = ... 

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

Vous cherchez casting, peut-être?

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

aurait besoin de placer une variable ou une propriété dans la classe de base qui stocke quel type il est ensuite tenter un casting (Liste [0] comme AA) et si elle ne retourne pas utiliser null l'objet nouvellement jeté pour sélectionner la variable désirée. La véritable question est de savoir pourquoi les classes dérivées ont besoin de leur propre variable d'ID, surtout si vous les lancez dans une liste basée sur cet ID.

+0

L'ID et l'AID ou BID est juste un exemple;) – ImtehQ

0

Il existe un moyen de le faire simplement et élégamment. Fournir une méthode abstraite dans votre classe de base (ou plusieurs d'entre eux):

public abstract void AID(parameters); 

Et dans chacune des classes de remplacer cette méthode pour faire une chose particulière liée à cette classe.

Ou vous pouvez prendre une alternative; vérifier pour chaque objet si elle est le type de chacune des classes:

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

quelques façons que vous pouvez essayer,

  1. va avec votre approche, jeter l'élément dans la liste ((AA)List[0]).AID.

Vous devriez avoir une certaine connaissance de l'objet qu'il appartient à AA afin d'accéder à la propriété AID sur elle.

si votre exigence est limitée à l'utilisation que vous avez décrit alors je suggère que vous avez quelque chose dans les lignes similaires fournies ci-dessous

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

Avec cette approche, vous pouvez vérifier le type de la classe et appeler la propriété appropriée sur elle.

+0

Une distribution ne fonctionnera pas, car je dois la lancer à plusieurs reprises. J'ai aussi essayé la méthode enum pour savoir de quel type il s'agissait avant le code, mais je pensais qu'il devait y avoir une meilleure façon de le faire. – ImtehQ