class Bla
{
public readonly int sum;
}
FieldInfo f = type.GetField("sum");
f.?? // what?
我如何找到是否sum是只读的?对于属性,我可以PropertyInfo.CanWrite查找成员是否具有写访问权限。
class Bla
{
public readonly int sum;
}
FieldInfo f = type.GetField("sum");
f.?? // what?
我如何找到是否sum是只读的?对于属性,我可以PropertyInfo.CanWrite查找成员是否具有写访问权限。
readonly意味着字段分配只能发生在字段声明附近或构造函数内部。所以你可以IsInitOnly在 a 上使用属性FieldInfo,它
获取一个值,该值指示该字段是否只能在构造函数的主体中设置
更多详细信息请参见IsInitOnlyMSDN 文章
FieldInfo f = typeof(Bla).GetField("sum");
Console.WriteLine(f.IsInitOnly); //return true
注意:您也可以使用IsLiteral属性来测试该字段是否为编译时间常数。它将为readonly字段返回 false,但为字段返回 true,标记为const。
另一个注意事项:反射不会阻止您写入readonlyandprivate字段(对于 也是如此public readonly,但我想展示一个更受限制的情况)。所以下面的代码示例是有效的,不会抛出任何异常:
class Bla
{
//note field is private now
private readonly int sum = 0;
}
现在,如果您获取该字段并向其写入一个值(我BindingFlags用来获取私有非静态字段,因为默认情况下GetField不会返回私有字段)FieldInfo
FieldInfo field = typeof(Bla).GetField("sum", BindingFlags.NonPublic |
BindingFlags.Instance);
var bla = new Bla();
field.SetValue(bla, 42);
Console.WriteLine(field.GetValue(bla)); //prints 42
一切正常。仅当字段为const.
f.Attributes应该包含FieldAttributes.InitOnly