#c# #xml #dictionary #generics #reflection
#c# #xml #словарь #общие #отражение
Вопрос:
Я работаю над пользовательской сериализацией XML для этого PropertyList DTD, и пока я полностью рассмотрел все типы, кроме «dict». Некоторые из dicts по сути являются объектами, подобными этому:
<key>1</key>
<dict>
<key>Track ID</key><integer>1</integer>
<key>Name</key><string>Baby</string>
<key>Artist</key><string>Justin Bieber</string>
[...]
</dict>
С которым я уже разобрался.
property.SetValue(obj, xmlReader.ReadElementContentAs(propertyType, null));
Для массивов я смог использовать нетипизированный Array
класс (используя ArrayList
класс для его создания), который позволяет работать с переменными типа вместо обобщенных, а затем удобно может перейти прямо в SetValue
метод и автоматически преобразовываться в int[]
или любой другой универсальный объект, который есть в объекте.
ArrayList array = new ArrayList();
do
{
array.Add(GetDictValue(arrayReader, elementType));
}
while (arrayReader.ReadToFollowing(elementTypeName));
property.SetValue(obj, array.ToArray(elementType));
Но я не могу найти какой-либо такой способ сделать это для словарей. Hashtable
невозможно преобразовать в универсальный Dictionary<TKey, TValue>
без общих параметров.
Комментарии:
1. Если начинать с
IDictionary<string, object>
, сохраняется ли эта «проблема»? Все ключи выглядят как строки, и значения могут быть смешаны..
Ответ №1:
Я бы создал 2-й xmlreader для чтения дочернего элемента :
XmlReader reader = XmlReader.Create(@"c:temptest.xml");
reader.ReadToFollowing("ENVELOPE");
StringReader sReader = new StringReader(reader.ReadInnerXml());
XmlReader childReader = XmlReader.Create(sReader);
childReader.MoveToContent();
reader.MoveToContent();