从具有反射的动态反序列化Json对象获取属性-.NET Core 3.1 C#

从具有反射的动态反序列化Json对象获取属性-.NET Core 3.1 C#,c#,asp.net-core,reflection,C#,Asp.net Core,Reflection,我目前正在学习如何进行反射,并且在获取严格类型类的属性和值方面取得了成功。但是,当我尝试使用动态对象时,会出现一个异常: System.Reflection.TargetParameterCountException:参数计数不匹配 我在这里尝试了一些解决方案(例如,objectfoo=dynamic obj,然后使用obj),但似乎没有一个有效,因为它们不能完全反映我的问题 这是我的密码: dynamic evtPc1 = JsonConvert.DeserializeObject(json)

我目前正在学习如何进行反射,并且在获取严格类型类的属性和值方面取得了成功。但是,当我尝试使用
动态
对象时,会出现一个异常:

System.Reflection.TargetParameterCountException:参数计数不匹配

我在这里尝试了一些解决方案(例如,
objectfoo=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)}");
}
dynamic evtPc1=JsonConvert.DeserializeObject(json);
PropertyInfo[]properties=evtPc1.GetType().GetProperties();
for(int i=0;i
如果您真的想要反序列化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);
}
dynamic evtPc1=JsonConvert.DeserializeObject(json);
PropertyInfo[]properties=evtPc1.GetType().GetProperties();
for(int i=0;i
但如果您只想从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;
        }
    }
}
dynamic evtPc1=JsonConvert.DeserializeObject(json);
PropertyInfo[]properties=evtPc1.GetType().GetProperties();
for(int i=0;i
按照:“调用
GetValue(对象)
重载以检索非索引属性的值;如果尝试检索索引属性的值,该方法将抛出
TargetParameterCountException
异常。您可以通过调用
GetIndexParameters
方法来确定属性是否索引。如果返回的
参数的长度terInfo
数组为零,属性没有索引。“也许这会有所帮助:另外,我建议使用JsonSerializer而不是JSON.NET。请参见此处的新方法: