2010-10-28 60 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.