Словарь, содержащий словари со значениями ObservableCollection, которые имеют разные типы сущностей - PullRequest
0 голосов
/ 28 октября 2010

Я пытаюсь реализовать класс в приложении Silverlight 4 RIA Services, который управляет различными ObservableCollections, которые используются для привязки данных.Эти ObservableCollections должны быть идентифицированы по имени строки и целочисленному classID, которые я реализовал, вложив объекты Dictionary в объект Dictionary>.Проблема в том, что если у меня есть явные типы сущностей (что я и делаю), эта структура, похоже, не работает.Кажется, проблема возникает, когда я пытаюсь поместить 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, но это не решило проблему (это была, по общему признанию, слабая попытка).

Заранее спасибо за ваши идеи.Если есть намного лучший шаблон, который я мог бы реализовать здесь, я открыт для гибкости.В основном я хочу избежать необходимости кодировать кучу специфической логики типа Entity для управления обновлением этого класса.Кажется, это должно быть обобщено.

Alex

1 Ответ

0 голосов
/ 29 октября 2010

Чтобы это работало, вам нужно объявить 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...