2016-07-29 71 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

就需要下在基类变量或属性,用于存储它是什么类型然后试图铸造(列表[0]为AA),如果没有返回null使用新投对象选择所需的变量。

真正的问题是为什么派生类需要自己的ID变量,特别是如果您根据所述ID将它们放入列表中。

+0

ID和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