如何从一个类中获取私有静态字段的值?

38

有没有办法使用反射从已知类中获取私有静态字段的值?

5个回答

83

是的。

Type type = typeof(TheClass);
FieldInfo info = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Static);
object value = info.GetValue(null);

这是针对字段的说明。如果是属性,请将type.GetField更改为type.GetProperty。您也可以以类似的方式访问私有方法。


1
值得注意的是,静态字段也可以通过info.SetValue(null, value)进行赋值。我使用了这个答案来给一个静态字段设置值。 - IAbstract

4

我想有人应该问一下这是不是一个好主意?它会创建对此静态类的私有实现的依赖。私有实现可能会在没有通知使用反射访问私有实现的人的情况下发生更改。

如果这两个类是为了配合工作而设计的,请考虑将字段设置为internal,并在[assembly:InternalsVisibleTo]属性中添加协作类的程序集。


3
在生产代码中,这通常不是一个好主意。但在单元测试时,它可以非常有用,因为你可以编写测试而不必暴露你想要保持私有的字段。 - AVee
4
为了进行单元测试,将字段设置为“internal”并使用“InternalsVisibleTo”。更好的做法是,单元测试不应该测试实现,而应该测试正确的行为。通过依赖私有字段,现在如果类的实现发生变化,单元测试将会失败。 - John Saunders
1
我同意@JohnSaunders的看法,这种方法非常脆弱。但有些情况下,它应该作为临时解决方案存在 - 即生产代码已经发布,但我需要一个特殊的工具来运行一些验收测试。我只能通过反射访问私有静态字段来实现这一点。这段代码将会改变,反射类将被修改以允许下一个版本中所需的交互。 - IAbstract

2

0
如果您拥有完全的信任,您应该能够做到以下事情:
Type t = typeof(TheClass);
FieldInfo field = t.GetField("myFieldName", BindingFlags.NonPublic | BindingFlags.Static);
object fieldValue = field.GetValue(myObject);

然而,如果您在没有完全信任的系统上运行此代码,则 GetField 调用将失败,并且代码将无法正常工作。


-1
尝试像这样做:

Type type = typeof(MyClass);
MemberInfo[] members = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Static);

我认为这应该可以工作。


MemberInfoو²،وœ‰GetValue(...)وˆ–SetValue(...)و–¹و³•م€‚وˆگه‘کو›´ه¸¸è§پçڑ„وک¯ه®‍é™…çڑ„و–¹و³•/ه‡½و•°م€‚ - IAbstract

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接