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
,它
获取一个值,该值指示该字段是否只能在构造函数的主体中设置
更多详细信息请参见IsInitOnly
MSDN 文章
FieldInfo f = typeof(Bla).GetField("sum");
Console.WriteLine(f.IsInitOnly); //return true
注意:您也可以使用IsLiteral
属性来测试该字段是否为编译时间常数。它将为readonly
字段返回 false,但为字段返回 true,标记为const
。
另一个注意事项:反射不会阻止您写入readonly
andprivate
字段(对于 也是如此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