У меня есть общий класс, который реализует словарь. Я создал пользовательский 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 использовать только этот?
Ой, извините, если я не был чист. Проблема не в том, чтобы его компилировать (я уже реализовал эти члены). Проблема была больше связана с тем, как DataContractSerializer видит класс. – hypehuman