You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中利用反射将JSON反序列化至静态类的实现方案

如何高效通过反射将Dynamic JSON对象的值复制到静态类的静态字段中?

我完全理解你的场景——作为共享库的全局静态设置,没法调整架构改成单例之类的,还得兼容后续新增的类成员,反射确实是唯一可行的方案。你当前的实现反复调用JsonConvert.DeserializeObject的效率问题很明显,每次都要把值转成字符串再重新解析JSON,完全是做了冗余工作。

优化思路

既然你已经通过JsonConvert.Deserialize<dynamic>得到了动态对象,它的本质其实是JObject的包装。我们可以直接操作JObject来获取对应值,利用Newtonsoft.Json内置的类型转换能力,省去重复序列化反序列化的开销。

高效实现代码

针对静态字段的情况(比如你的示例类A)

using Newtonsoft.Json.Linq;

// 先把dynamic转为实际的JObject(JsonConvert.Deserialize<dynamic>返回的底层就是它)
var settingsJObject = Data as JObject;
if (settingsJObject == null)
{
    // 处理JSON解析失败的情况,比如抛出异常或者返回
    return;
}

// 获取静态类的所有公开静态字段(如果有内部字段,加上BindingFlags.NonPublic)
var staticFields = typeof(A).GetFields(BindingFlags.Static | BindingFlags.Public);

foreach (var field in staticFields)
{
    // 从JObject中匹配字段名对应的Token
    var valueToken = settingsJObject[field.Name];
    if (valueToken == null || valueToken.Type == JTokenType.Null)
    {
        // 可选:如果JSON里没有这个字段或者值为null,可以设置默认值或者跳过
        continue;
    }

    // 直接将Token转换为字段类型,无需二次反序列化
    var targetValue = valueToken.ToObject(field.FieldType);
    // 给静态字段赋值,第一个参数传null因为是静态成员
    field.SetValue(null, targetValue);
}

针对静态属性的情况(如果你的Settings类用的是属性而非字段)

如果你的静态类是用属性定义的(比如你自己代码里的Settings类),只需要稍微调整:

using Newtonsoft.Json.Linq;

var settingsJObject = Data as JObject;
if (settingsJObject == null) return;

var staticProperties = typeof(Settings).GetProperties(BindingFlags.Static | BindingFlags.Public);

foreach (var prop in staticProperties)
{
    var valueToken = settingsJObject[prop.Name];
    if (valueToken == null || valueToken.Type == JTokenType.Null)
        continue;

    var targetValue = valueToken.ToObject(prop.PropertyType);
    prop.SetValue(null, targetValue);
}

为什么这个方案更高效?

  • 避免了字符串拼接和二次JSON解析:原方案把值转成带引号的字符串再反序列化,不仅慢,还可能因为值本身包含引号导致JSON格式错误(比如字符串里的双引号没转义的话,拼接出来的JSON就无效了)。
  • 直接利用JToken的类型转换:ToObject<T>是Newtonsoft.Json针对JToken优化的转换方法,比通用的反序列化快得多。
  • 更安全的空值处理:可以明确处理JSON中不存在的字段或者null值,避免意外赋值。

这个方案既保留了反射的灵活性(完全支持后续新增类成员,不需要修改代码),又解决了原方案的效率问题。

内容的提问来源于stack exchange,提问作者Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:49:22