class Bla
{
public readonly int sum;
}
FieldInfo f = type.GetField("sum");
f.?? // what?
如何查找sum
是否只读?对于属性,我可以PropertyInfo.CanWrite
查找成员是否具有写访问权。
答案 0 :(得分:35)
readonly
表示字段分配只能在字段声明附近或构造函数内部进行。因此,您可以在IsInitOnly
上使用FieldInfo
属性,
获取一个值,该值指示该字段是否只能在构造函数的主体中设置
更多详情请见IsInitOnly
MSDN article
FieldInfo f = typeof(Bla).GetField("sum");
Console.WriteLine(f.IsInitOnly); //return true
注意:您还可以使用IsLiteral
属性来测试字段是否为编译时间常量。对于readonly
字段,它将返回false,但对于标记为const
的字段,则为true。
另一个注意事项:反射不会阻止您写入readonly
和private
字段(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
时才会抛出异常。
答案 1 :(得分:1)
f.Attributes
应包含FieldAttributes.InitOnly