从存储父类类型的字典访问子属性

时间:2014-12-11 00:14:09

标签: c#

我有一种情况,我想创建一个可以保存父类型和子类型的字典。我想存储不同的子类型,并能够调用他们的数据。

我遇到的问题是,当将对象拉出字典时,它们被视为父类型,因为字典类型被设置为父对象。我想出去访问其他属性的唯一方法是使用var实例化一个新对象(见下文)。

非常感谢任何帮助。此外,如果我的术语/术语不正确,请随时纠正我,因为我正在努力学习。谢谢!

更新:我稍微更新了我的代码,试图准确地传达我想要做的事情。 (添加了foreach循环)。

        public class parent
        {
            public string name;     
        }

        public class child : parent 
        {
           public int age;      
        }

        public class library
        {               
        }

        public class Program
        {
           public static void Main(string[] args)
           {                
              Dictionary<int, parent> dictionary = new Dictionary<int, parent>();
              child child1 = new child();
              child child2 = new child();

              child1.age = 5;
              child2.age = 10;

              dictionary.Add(1,child1);
              dictionary.Add(2,child2);    


     foreach(KeyValuePair<int, parent> d in dictionary)  
    {

    Console.WriteLine(d.age);

    }                  


          }
}

2 个答案:

答案 0 :(得分:1)

如果你这样做,你的设计可能是错误的,但你已经把它弄错了。

var child1a = child1 as child;

实例化新对象。它只是向下转换为child类型。向下转换是一种代码气味,因此请考虑将设计重新设计到不需要的地方。

此外,如果演员表失败,as将返回null,因此您应该检查它:

var child1a = child1 as child;

if (child1a != null)
  Console.WriteLine(child1a.age);

最后,你从来没有实际在代码中使用了字典,你可能想要这样做:

var child1a = dictionary[1] as child;

if (child1a != null)
  Console.WriteLine(child1a.age);

对于您的更新,该循环将从不工作(也不应该)。并非您的收藏中的所有对象都保证具有“年龄”属性。

关于你的循环,你可以这样做:

foreach (child item in dictionary.Values)
{
    ...
}

或:

foreach (KeyValuePair<int, parent> kvp in dictionary)
{ 
   if (kvp.Value is child)
   {
       child item = (child)kvp.Value;
       ...
   }
}

这将从您的值集合中提取child项,并允许您使用它们。如果这就是你所做的一切,Dictionary 方式在这里过度杀伤。

答案 1 :(得分:1)

这是另一种只访问词典child成员的方法:

Dictionary<int, parent> dictionary = new Dictionary<int, parent>();
child child1 = new child();
child child2 = new child();

child1.age = 5;
child2.age = 10;

dictionary.Add(1,child1);
dictionary.Add(2,child2);
dictionary.Add(45, new parent());

foreach(var c in dictionary.Select(x => x.Value).OfType<child>())
{
    Console.WriteLine(c.age);
}

这让我只是5&amp; 10并忽略我在字典中放置的parent对象。