如何通过Harmony/Reflection修改static readonly整数?
修改static readonly整数变量的可行方案
反射方法(解决空引用+readonly限制)
空引用大概率是因为没正确获取到目标字段,先确保字段查找逻辑正确,再移除readonly限制:
精准获取目标字段
要覆盖所有可能的访问修饰符(public/private/internal),指定正确的BindingFlags:var targetField = typeof(目标类名).GetField("目标字段名", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);注意:如果是嵌套类,要写成
typeof(外部类.嵌套类);泛型类要指定具体泛型参数,比如typeof(GenericClass<int>)。移除readonly限制
static readonly字段的IsInitOnly标记会阻止修改,需要通过反射取消这个标记:var isInitOnlyField = typeof(FieldInfo).GetField("m_isInitOnly", BindingFlags.Instance | BindingFlags.NonPublic); isInitOnlyField.SetValue(targetField, false);设置新值
static字段不需要实例,直接传null即可:targetField.SetValue(null, 26);
Harmony Traverse方法(简化版)
如果之前用Traverse失败,检查是否正确定位了字段:
// 针对静态字段,直接通过类类型创建Traverse Traverse.Create(typeof(目标类名)) .Field("目标字段名") .SetValue(26);
如果字段是私有或内部的,Traverse会自动处理访问权限,无需额外设置;若目标类是泛型,同样要指定完整泛型类型。
常见排查点
- 字段名拼写严格区分大小写,检查是否和源码一致
- 确认BindingFlags包含了字段的访问级别(比如私有字段必须加
BindingFlags.NonPublic) - 若目标类在其他程序集,确保已正确引用或通过程序集加载获取类型
内容的提问来源于stack exchange,提问作者elmish
相关产品推荐
相关产品推荐

