在C#中将var转换为类类型?

时间:2017-02-08 07:20:30

标签: c#

我是C#的新手,正在经历ArrayList。我的问题是我们可以将不同的数据类型 - 不同的类,不同的结构存储到ArrayList中并访问它们。我可以看到我可以添加它们,但我不确定如何检索它。我尝试使用数据类型名称,即类名称进行检索,但我看到在打印输出时第一个成员数据丢失。 我在这里错过了什么概念?

class OSPF_Area
{
    public string AreaId { get; set; }
    public string AreaName { get; set; }
    public int AreaNumberofRoutes { get; set; }
}

class OSPFLinkPacket
{
    public int LinkPacketCounts { get; set; }
    public int NumberOfHelloPacket { get; set; }
    public string LSAType { get; set; }
}

static void Main(string[] args)
{
    OSPF_Area ospfArea1 = new OSPF_Area();
    ospfArea1.AreaId = "0.0.0.1";
    ospfArea1.AreaId = "non-backbone";
    ospfArea1.AreaNumberofRoutes = 14;

    OSPFLinkPacket ospfLink1 =  new OSPFLinkPacket();
    ospfLink1.LinkPacketCounts = 20;
    ospfLink1.LSAType = "Type4";
    ospfLink1.NumberOfHelloPacket = 40;

    ArrayList OSPFInfo = new ArrayList();

    OSPFInfo.Add(ospfLink1);
    OSPFInfo.Add(ospfArea1);

    foreach(var val in OSPFInfo)
    {
        if(val.GetType().Name == "OSPF_Area")
        {
            Convert.ChangeType(val, typeof(OSPF_Area));
            OSPF_Area area = (OSPF_Area)val;
            Console.WriteLine(area.AreaId);
            Console.WriteLine(area.AreaName);
            Console.WriteLine(area.AreaNumberofRoutes);
        }
    }
    Console.ReadLine();
}

输出结果为:

  

非bacbone
  14

我不确定为什么没有打印区域ID。

1 个答案:

答案 0 :(得分:11)

首先,我建议你不要使用ArrayList。尽可能使用List<T>,尽管在列表中存储不同类型的对象是一种反模式开始。

Convert.ChangeType不会为您做任何事情,您应该使用isas。例如:

OSPF_Area area = val as OSPF_Area;
if (area != null)
{
    Console.WriteLine(area.AreaId);
    Console.WriteLine(area.AreaName);
    Console.WriteLine(area.AreaNumberofRoutes);
}

输出的问题几乎可以肯定是由于Main的第一行中的拼写错误:

ospfArea1.AreaId = "0.0.0.1";
ospfArea1.AreaId = "non-backbone";

...您没有为AreaName分配任何内容。