2010-10-28 58 views
0

我試圖在管理用於數據綁定的不同ObservableCollections的Silverlight 4 RIA Services應用程序中實現類。這些ObservableCollections需要用一個字符串名和一個整數classID來標識,我已經通過在Dictionary>對象中嵌套Dictionary對象來實現這個類。問題是,如果我有明確的實體類型(我這樣做),這個結構似乎不起作用。當我試圖將一個ObservableCollection放入一個ObservableCollection(我猜測如何實現一個通用實體列表)時,問題似乎就會發生。包含具有不同實體類型的ObservableCollection值的詞典的詞典

例如:

this.rawData = new Dictionary<int, ObservableCollection<DataRaw>>(); 
    this.constData = new Dictionary<int, ObservableCollection<SystemConstant>>(); 

    this.masterData = new Dictionary<string, Dictionary<int, ObservableCollection<Entity>>>(); 

    masterData.Add("test", rawData); <--- ERROR OCCURS HERE, 'best overloaded method has invalid arguments' 

注意,我一直在使用「對象」,而不是在masterData的實例化「實體」嘗試過,但沒有解決不了的問題(這是無可否認的一個微弱的嘗試)。

在此先感謝您的見解。如果我可以在這裏實施更好的模式,我願意保持靈活性。我主要希望避免編寫一些實體類型特定的邏輯來管理此類的更新。這似乎應該是可以概括的。

亞歷

+0

是DataRaw從實體派生的類? – Murven 2010-10-29 05:39:31

+0

是的,我相信。這是一個由我的數據庫構建的實體框架生成的類。 – user483679 2010-10-29 06:10:32

回答

0

對於這個工作,你將不得不使用父類型申報RAWDATA,像這樣:

this.rawData = new Dictionary<int, ObservableCollection<Entity>>(); 

即使這本詞典只持有DataRaw情況下,即使DataRaw是來自Entity,因此不可能在ObservableCollection<DataRaw>ObservableCollection<Entity>之間進行隱式轉換。有那麼一刻我猶豫了對C#是否能解決這個使用差異,但概念的快速證據之後,很明顯它不能:

 var dataRaw = new DataRaw(); 
     Entity testEntity = dataRaw; 

     var entityObservable = new ObservableCollection<Entity>(); 

     entityObservable.Add(dataRaw); // This is OK 

     var dataRawObservable = new ObservableCollection<DataRaw>(); 
     dataRawObservable.Add(dataRaw); // This is fine too. 

     entityObservable = dataRawObservable; // This is not valid 

     var metaDictionary = new Dictionary<Int32, ObservableCollection<Entity>>(); 

     metaDictionary.Add(1, dataRawObservable); // This isn't valid either. 

     metaDictionary.Add(2, entityObservable); // This is valid.