C#不同类的列表

时间:2016-07-29 12:12:15

标签: c# list class base-class

我找不到搜索的答案。

我需要一个包含不同类的List,每个类都是基类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,编辑不会认为我只使用其中一个。

我尝试制作List<BaseA>,但这只会暴露bassA属性,而我需要的是能够List[0].AID能够理解AID意味着什么,如果我&#39 ;我在谈论AA班。

我可能会犯错,有人能指出我正确的方向吗?

5 个答案:

答案 0 :(得分:0)

您可以尝试使用 Linq

  List<BaseA> list = ...

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

答案 1 :(得分: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;
}

答案 2 :(得分:0)

需要在基类中放置一个变量或属性来存储它的类型然后尝试强制转换(List [0]为AA),如果它没有返回null,则使用新建的对象来选择所需的变量。

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

答案 3 :(得分: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
}

答案 4 :(得分:0)

你可以尝试几种方式,

  1. 按照您的方法,将列表中的项目投放到((AA)List[0]).AID
  2. 您应该了解它属于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; }
    }
    

    使用这种方法,您可以检查类的类型并在其上调用适当的属性。