2009-09-19 55 views
1

我有一個基類型,3種不同的對象被繼承。讓我們調用基礎對象B,繼承X,Y和Z.現在我有了一個int作爲鍵和分別作爲X,Y,Z值的字典。多語言與字典

我有一個控件,需要在特定的字典中進行查找,以便繪製自己,但能夠與我的所有三本字典一起工作我試着指定控件應該採用一個參數相等到Dictionary<int, B>。但這並不奏效。

那麼我有什麼選擇?我希望我的控件可以使用<int, B>形式的所有字典。

回答

7

作出這樣一個通用的方法:

public void DoSomething<T>(IDictionary<int, T> dictionary) where T : B 

或類似的使自己的通用(這將給你的設計師的問題,但...)

public class MyControl<T> where T : B 
{ 
    private IDictionary<int, T> dictionary; 
    ... 
} 

你需要這樣做控制由於通用的不變性。即使在C#4(它支持一些差異),這將是不變的:字典使用輸入輸出的值。

想象一下,你可以從Dictionary<int, X>轉換爲Dictionary<int, B>。那麼你可以寫:

dictionary[0] = new B(); 

...這顯然不會爲字典是有效的,因爲它不是一個X ...

+1

注:一種選擇是唯一可行的當該控件在其整個生命週期中採用三種特定類型之一。第一個選項允許您根據需要切換類型。 – Joren 2009-09-19 21:24:07

+0

工作就像一個魅力!我無法相信我是如何錯過的。我添加了到T:B的類定義中,然後在構造函數中我使用了一個Dictionary 對象。真棒回答。該控件不需要改變使用哪種類型。每個控件僅在整個生命週期中使用一個控件。 – 2009-09-19 21:28:28