我正在尝试更改public static readonly string
内System.Web.Mvc
的值。
具体来说,我正在尝试实现this post上标记的答案,我正在使用以下代码:
var htmlHelper = typeof(HtmlHelper);
var field = htmlHelper.GetField("ValidationInputCssClassName", BindingFlags.Public | BindingFlags.Static);
if (field != null)
{
// existing value is "input-validation-error"
field.SetValue(null, "has-error");
}
但是,在我设置了值之后,GetValue
表示没有任何更改,这在结果网页上得到了证实。
我能想到的唯一解释是.NET的JIT编译器在我可以更改之前缓存只读字段。
或者有人有更好的建议吗?
更新
如果我在调用field.GetValue(null)
后立即致电SetValue
,我会得到值'has-error',正如我所期望的那样,这表明static readonly
值可以改变。
但是,当网页加载时,我发现存在未更改的字段。
更新2:
我相信上面的代码正在修改public static readonly string
字段。我之前的困惑是由于(1)在错误的事件中检查GetValue
(或者可能不是所有线程),以及(2)网页仍在使用旧值,因为我刚刚意识到,是由于Microsoft的jquery.validate.unobtrusive.js脚本具有硬编码的CSS类的名称。这就是为什么我一直看到页面上的旧值,不是,因为Reflection没有更新字段值。
随时抱歉道歉。
答案 0 :(得分:0)
初始化后(内联或构造函数)无法更改只读值。