Использование отражения для преобразования нестандартного словаря в универсальный без общих параметров

#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();