Я хочу перебрать цикл Dictionary<string, object>
с помощью foreach
. Сначала я получаю все items
с помощью отражения. А когда item.Name
нет settings
, программа идет по пути else
. Здесь item
имеет тип Dictionary<string, object>
во время выполнения. Но я получаю сообщение об ошибке, потому что во время компиляции item
имеет тип PropertyInfo
. Можно ли перебрать словарь?
PropertyInfo[] propertyInfos = MyResponse.MyDocument.GetType().GetProperties();
foreach (var item in propertyInfos)
{
if (item.Name != "settings")
{
// do something
}
else
{
foreach (var setting in item) // Compiler Error CS1579
{
// do something else
}
}
}
Ошибка компилятора CS1589 в Microsoft Learn
Я использую .NET Framework 4.5.
Здесь
item
имеет типDictionary<string, object>
во время выполнения.
Нет, это не так; он имеет тип PropertyInfo
(или, возможно, какой-то более конкретный подкласс, например RuntimePropertyInfo
). Если вам нужно значение свойства для конкретного объекта (при условии, что он нестатический), вы можете получить значение с помощью item.GetValue(MyResponse.MyDocument)
. Однако это дает вам object
; если вы знаете, что значение равно Dictionary<string, object>
, вы можете использовать:
var untyped = item.GetValue(MyResponse.MyDocument);
var typed = (Dictionary<string, object>)untyped;
теперь вы можете использовать функции typed
, например foreach
Этот вопрос похож на: Получить значение свойства из строки с помощью отражения. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.