2016-07-29 5 views
1

Я не нашел ответ в поиске.C# Список различных классов

Мне нужен Список, который содержит разные классы, каждый из которых присущ базовому классу BaseA, но каждый из них будет иметь свойства, которых другие не будут иметь, или некоторые из них будут использовать тот же класс.

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

Теперь вопрос, как я могу получить один список, который может содержать класс AA, AB и AC и редактор не будет думать, что я только работать с одним из них.

Я попытался сделать List<BaseA>, но это откроет только свойства bassA, и мне нужно как можно сделать List[0].AID, где он поймет, что означает AID, если я говорю об классе AA.

Возможно, я ошибаюсь, может кто-то указать мне в правильном направлении?

+2

Звучит так, как будто у вас есть дефект дизайна.Вернитесь к шагу и решите, есть ли у вас даже общий список для этих классов. – Default

+0

Возможно, вы правы, но общий список для этих классов является лучшим решением, а затем 9 списками для прохождения. – ImtehQ

+0

Возможно, нет, если у вас должно быть 9 различных способов извлечения данных из этого единственного списка. – Default

ответ

0

Вы можете попробовать использовать Linq для этого:

List<BaseA> list = ... 

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

Вы ищете для литья, может быть?

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

бы нужно поместить переменную или свойство в базовом классе, который хранит какого типа он затем попытается слепок (List [0] в качестве AA), и если он не возвращает нулевое использование вновь бросить объект для выбора требуемой переменной.

Реальный вопрос, почему производным классам нужна их собственная переменная идентификатора, особенно если вы бросаете их в список на основе указанного идентификатора.

+0

Идентификатор и AID или BID - это просто пример;) – ImtehQ

0

Существует возможный способ сделать это просто и элегантно. Обеспечить абстрактный метод в своем базовом классе (или несколько из них):

public abstract void AID(parameters); 

И в каждом из классов переопределить этот метод, чтобы сделать определенную вещь, связанную с этим классом.

Или вы можете воспользоваться альтернативным способом; проверить для каждого объекта, если это тип каждого из классов:

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

Пара способов, вы можете попробовать,

  1. происходит с вашим подходом, отлитый элемент в списке ((AA)List[0]).AID.

Вы должны иметь некоторые знания об объекте, что он принадлежит к AA для того, чтобы получить доступ к свойству AID на нем.

если ваше требование ограничивается использованием, что вы описали, то я бы предположил, что у вас есть что-то в подобных строках приводится ниже

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

При таком подходе, вы можете проверить тип класса и назовите соответствующее свойство.

+0

Приведение не будет работать, так как я должен много раз его использовать. Я также пробовал перечислить способ узнать, какой тип был до некоторого кода, но я думал, что должен быть лучший способ сделать это. – ImtehQ

Смежные вопросы