簡體   English   中英

使用反射從動態反序列化 Json 對象獲取屬性 - .NET Core 3.1 C#

[英]Get Properties From Dynamic Deserialized Json Object with Reflection - .NET Core 3.1 C#

我目前正在學習如何進行反射,並且在獲取字符串類型類的屬性和值方面取得了成功。 但是,當我嘗試使用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)}");
}

如果您真的想要反序列化 JSON 的屬性,您可以按照 docs 的說明進行操作,盡管您可能會對輸出感到驚訝:

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;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM