Получить свойства из Dynami c Десериализованный Json Объект с отражением -. NET Core 3.1 C# - PullRequest
0 голосов
/ 17 января 2020

В настоящее время я учусь, как делать рефлексию, и я добился успеха в том, что касается получения свойств и значений строго типизированного класса. Однако, когда я пытаюсь использовать объект dynamic, я получаю исключение:

System.Reflection.TargetParameterCountException: Несоответствие количества параметров.

Я пробовал некоторые решения (например, object foo = dynamic obj, затем использовал obj), но ни одно из них не работает, потому что они не совсем отражают мою проблему.

Вот мой код:

dynamic evtPc1 = JsonConvert.DeserializeObject(json);

PropertyInfo[] properties = evtPc1.GetType().GetProperties();

for (int i = 0; i < properties.Length; i++)
{
    Console.WriteLine($"Property: {properties[i].GetValue(evtPc1)}");
}

1 Ответ

0 голосов
/ 17 января 2020

Если вы действительно хотите свойства десериализованного JSON, вы можете делать то, что говорит документация, хотя вы можете быть удивлены выводом:

dynamic evtPc1 = JsonConvert.DeserializeObject(json);
PropertyInfo[] properties = evtPc1.GetType().GetProperties();
for (int i = 0; i < properties.Length; i++)
{
    var prop = properties[i];

    if (prop.GetIndexParameters().Length == 0)
        Console.WriteLine("{0} ({1}): {2}", prop.Name,
            prop.PropertyType.Name,
            prop.GetValue(evtPc1));
    else
        Console.WriteLine("{0} ({1}): <Indexed>", prop.Name,
            prop.PropertyType.Name);
}

Но если вы хотите получить только свойства из JSON самого , это немного сложнее (не уверен, что этот код является оптимальным, хотя). Обратите внимание, что этот код не охватывает случай вложенных JSON объектов:

dynamic evtPc1 = JsonConvert.DeserializeObject(json);
PropertyInfo[] properties = evtPc1.GetType().GetProperties();
for (int i = 0; i < properties.Length; i++)
{
    var prop = properties[i];

    if (prop.Name == nameof(JToken.First) && prop.PropertyType.Name == nameof(JToken))
    {
        var token = (JToken) prop.GetValue(evtPc1);
        while (token != null)
        {
            if (token is JProperty castProp)
                Console.WriteLine($"Property: {castProp.Name}; Value: {castProp.Value}");

            token = token.Next;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...