23
class Bla
{
    public readonly int sum;
}

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

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

4

2 回答 2

42

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.

于 2013-03-31T14:17:21.623 回答
2

f.Attributes应该包含FieldAttributes.InitOnly

于 2013-03-31T14:21:09.500 回答