получить список ключей и значений из неизвестного типизированного словаря без использования dynamic

#c# #dictionary

#c# #словарь

Вопрос:

Я пытаюсь преобразовать словарь в пары ключ-значение, чтобы я мог выполнить для него специальный синтаксический анализ и сохранить его в строковом формате. Я использую Unity, поэтому не могу использовать ключевое слово dynamic. Вот моя настройка

У меня есть некоторый класс, который я перебираю по его свойствам, манипулирую их значением и помещаю их в новый словарь. Проблема в том, что я не знаю, как получить ключи и значения из словаря, для которого я не знаю типов, без использования динамического трюка. Есть мысли? Мне нужно будет сделать то же самое со списками.

     Type t = GetType();
    Dictionary<string, object> output = new Dictionary<string, object>();
    foreach(PropertyInfo info in t.GetProperties())
    {
        object o = info.GetValue(this, null);
        if(info.PropertyType.GetGenericTypeDefinition() == typeof(Dictionary<,>))
        {
            Dictionary<string, object> d = new Dictionary<string, object>();
            foreach(object key in o) //not valid
            {
                object val = DoSomething(o[key]);//not valid
                output[key] = val;
            }
        }
        else if(info.PropertyType.GetGenericTypeDefinition() == typeof(List<>))
        {

        }
    }
    return output;
  

Ответ №1:

Dictionary<TKey, TValue> также реализует не универсальный IDictionary интерфейс, так что вы можете использовать это:

 IDictionary d = (IDictionary) o;
foreach(DictionaryEntry entry in d)
{
    output[(string) entry.Key] = entry.Value;
}
  

Обратите внимание, что это, очевидно, приведет к сбою, если тип ключа не string является… хотя вы могли бы вызвать ToString вместо приведения.

Вы можете легко проверить наличие любой IDictionary реализации, на самом деле — не только Dictionary<,> — даже без неприятной проверки отражения:

 IDictionary dictionary = info.GetValue(this, null) as IDictionary;
if (dictionary != null)
{
    foreach (DictionaryEntry entry in dictionary)
    {
        output[(string) entry.Key] = entry.Value;
    }
}
  

Комментарии:

1. Спасибо за быстрый ответ! Позвольте мне попробовать это и посмотреть, работает ли это. Некоторые вещи плохо работают на IOS, тогда как другие работают. Я сообщу об этом. Вероятно, это произойдет не раньше понедельника

2. Я думаю, что это должна быть запись output[(string) . Key] = d[entry.Key];

3. @user2292539: Не совсем — так и должно быть output[(string) entry.Key] = entry.Value; — нет необходимости искать его по ключу, когда у нас уже есть запись со значением. Я исправил свой ответ.

4. Итак, подумав об этом некоторое время, я не знаю, почему я просто не использовал сериализацию в первую очередь для обработки того, что я хотел, но это все равно было полезно узнать.