簡體   English   中英

從存儲父類類型的字典中訪問子屬性

[英]Accessing child properties from a dictionary, which stores parent class type

我遇到一種情況,我想創建一個可以容納父類型和子類型的字典。 我想存儲不同的子類型並能夠調用他們的數據。

我遇到的問題是,將對象從字典中拉出時,它們被視為其父類型,因為字典類型被設置為父對象。 我發現訪問它們的其他屬性的唯一方法是通過使用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);

    }                  


          }
}

如果這樣做,您的設計可能是錯誤的,但是您已經正確了。

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

對於您的更新,該循環將永遠不會 (也不應該)。 並非保證您集合中的所有對象都具有“ 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一種過大的殺傷力。

這是僅訪問字典的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);
}

這樣我就只有510而忽略了我放入字典中的parent對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM