如何查找成员变量是否只读?

时间:2013-03-31 14:15:00

标签: c# .net reflection readonly fieldinfo

class Bla
{
    public readonly int sum;
}

FieldInfo f = type.GetField("sum");
f.??   // what?

如何查找sum是否只读?对于属性,我可以PropertyInfo.CanWrite查找成员是否具有写访问权。

2 个答案:

答案 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。

另一个注意事项:反射不会阻止您写入readonlyprivate字段(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