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

如何通过Harmony/Reflection修改static readonly整数?

修改static readonly整数变量的可行方案

反射方法(解决空引用+readonly限制)

空引用大概率是因为没正确获取到目标字段,先确保字段查找逻辑正确,再移除readonly限制:

  1. 精准获取目标字段
    要覆盖所有可能的访问修饰符(public/private/internal),指定正确的BindingFlags:

    var targetField = typeof(目标类名).GetField("目标字段名", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
    

    注意:如果是嵌套类,要写成typeof(外部类.嵌套类);泛型类要指定具体泛型参数,比如typeof(GenericClass<int>)。

  2. 移除readonly限制
    static readonly字段的IsInitOnly标记会阻止修改,需要通过反射取消这个标记:

    var isInitOnlyField = typeof(FieldInfo).GetField("m_isInitOnly", BindingFlags.Instance | BindingFlags.NonPublic);
    isInitOnlyField.SetValue(targetField, false);
    
  3. 设置新值
    static字段不需要实例,直接传null即可:

    targetField.SetValue(null, 26);
    

Harmony Traverse方法(简化版)

如果之前用Traverse失败,检查是否正确定位了字段:

// 针对静态字段,直接通过类类型创建Traverse
Traverse.Create(typeof(目标类名))
       .Field("目标字段名")
       .SetValue(26);

如果字段是私有或内部的,Traverse会自动处理访问权限,无需额外设置;若目标类是泛型,同样要指定完整泛型类型。

常见排查点

  • 字段名拼写严格区分大小写,检查是否和源码一致
  • 确认BindingFlags包含了字段的访问级别(比如私有字段必须加BindingFlags.NonPublic)
  • 若目标类在其他程序集,确保已正确引用或通过程序集加载获取类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:53:17