2012-03-19 2 views
4

У меня есть общий класс, который реализует словарь. Я создал пользовательский GetEnumerator, который перебирает значения вместо KeyValuePairs, потому что я обычно не забочусь о ключах. Вот краткий пример:Как сообщить DataContract использовать GetEnumerator базового класса?

public class AssetHolder<T> : Dictionary<string, T>, IEnumerable, INotifyCollectionChanged, INotifyPropertyChanged where T : Asset 
{ 
    // methods that don't relate to this post 
    ... 

    // enumeration methods 
    IEnumerator System.Collections.IEnumerable.GetEnumerator() // this one is called by WPF objects like DataGrids 
    { 
     return base.Values.GetEnumerator(); 
    } 
    new public IEnumerator<T> GetEnumerator() // this enumerator is called by the foreach command in c# code 
    { 
     return base.Values.GetEnumerator(); 
    } 
} 

Я не добавлял никаких данных в моем классе (я только добавил методы), поэтому для того, чтобы сделать его сериализации, я добавил [DataContract] в верхней части класса без любые теги [DataMember]. Я понял, что это просто будет использовать данные базового класса для сериализации/десериализации, но я получил следующую ошибку:

Невозможно передать объект типа «Перечислитель [System.String, SignalEngineeringTestPlanner.Asset]» для ввода «Система». Collections.Generic.IEnumerator`1 [System.Collections.Generic.KeyValuePair`2

Я думаю, это означает, что DataContractSerializer вызывает перечислитель для ребенка, и он запутывается, потому что он ожидает пару, но получает объект Asset. Есть ли способ, которым я могу (1) сообщить DataContractSerializer использовать перечислитель базового класса или (2) создать специальную функцию перечисления и сообщить DataContractSerializer использовать только этот?

ответ

1

Вы можете отметить тип как словарь в вместо вашего класса вашего производного класса. Недостатком является то, что вам придётся использовать его (или иметь отдельную ссылку с правильным типом), когда вы его используете.

0

мне удалось eleviate ошибки, которые вы получали путем реализации интерфейсов INotifyCollectionChanged и INotifyPropertyChanged в классе AssetHolder:

[DataContract] 
public class AssetHolder<T> : Dictionary<string, T>, IEnumerable, INotifyCollectionChanged, INotifyPropertyChanged where T : Asset 
{ 
    IEnumerator IEnumerable.GetEnumerator() // this one is called by WPF objects like DataGrids 
    { 
     return base.Values.GetEnumerator(); 
    } 
    new public IEnumerator<T> GetEnumerator() // this enumerator is called by the foreach command in c# code 
    { 
     return base.Values.GetEnumerator(); 
    } 

    event NotifyCollectionChangedEventHandler INotifyCollectionChanged.CollectionChanged 
    { 
     add { throw new NotImplementedException(); } 
     remove { throw new NotImplementedException(); } 
    } 

    event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged 
    { 
     add { throw new NotImplementedException(); } 
     remove { throw new NotImplementedException(); } 
    } 
} 
+0

Ой, извините, если я не был чист. Проблема не в том, чтобы его компилировать (я уже реализовал эти члены). Проблема была больше связана с тем, как DataContractSerializer видит класс. – hypehuman

Смежные вопросы