'public static readonly string`上的SetValue - 值不会改变

时间:2013-11-06 14:45:19

标签: c# asp.net asp.net-mvc reflection

我正在尝试更改public static readonly stringSystem.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没有更新字段值。 随时抱歉道歉。

1 个答案:

答案 0 :(得分:0)

初始化后(内联或构造函数)无法更改只读值。