2014-12-11 175 views
1

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

我正在運行的問題是,當將對象拉出字典時,它們被視爲它們的父類型,因爲字典類型被設置爲父對象。我想通過使用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); 

    }     


      } 
} 
+0

即使您的代碼顯示了所涉及的對象和類型,它實際上也不會顯示您遇到的問題。展示代表您問題的最少量代碼是適當的禮節。 – Enigmativity 2014-12-11 00:22:15

回答

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方式矯枉過正在這裏。

+0

你說得對。我其實已經打算把「var child1a = new child1作爲孩子;」當我的意思是實例化一個新的對象。但是,我仍然在尋找一種解決方案,將對象作爲子對象從字典中移出。我會更新我的代碼,但我期望做的是將每個項目從字典中拉出並訪問子屬性。謝謝。 – tchock 2014-12-11 00:52:20

+0

@parrotsnest我會更新我的答案,包括這一點,但你根本**不能**做到這一點。如果你將它存儲爲基類,它將以這種方式出現,故事結束。您必須投射以獲取派生屬性。這是必要的事實意味着你可能會錯誤地設計你的設計。修復您的設計是*真實*解決方案。 – BradleyDotNET 2014-12-11 00:59:38

+0

@parrotsnest另外'VAR child1a =新child1作爲child'毫無意義可言,而不會進行編譯。無論如何,實例化*不是*你在這裏尋找的東西,因爲看起來你已經想通了。 – BradleyDotNET 2014-12-11 01:06:48

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 & 10而忽略parent對象我把字典中。

+0

謝謝!這也適用。 :) – tchock 2014-12-11 03:25:07