gpt4 book ai didi

c# - 如何查找成员变量是否为只读?

转载 作者:IT王子 更新时间:2023-10-29 04:42:03 26 4
gpt4 key购买 nike

class Bla
{
public readonly int sum;
}

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

如何确定 sum 是否为只读?对于属性,我可以执行 PropertyInfo.CanWrite 来查找成员是否具有写入权限。

最佳答案

readonly 表示字段赋值只能发生在字段声明附近或构造函数内部。因此,您可以在 FieldInfo 上使用 IsInitOnly 属性,

Gets a value indicating whether the field can only be set in the body of the constructor

更多细节在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 获取私有(private)非静态字段,因为 GetField 不会返回 FieldInfo 默认为私有(private)字段)

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 时才会抛出异常。

关于c# - 如何查找成员变量是否为只读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15730308/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com