#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. Итак, подумав об этом некоторое время, я не знаю, почему я просто не использовал сериализацию в первую очередь для обработки того, что я хотел, но это все равно было полезно узнать.