C# 如何从类中获取私有静态字段的值?
是否有任何方法可以使用反射从已知类获取私有静态字段的值?是C# 如何从类中获取私有静态字段的值?,c#,reflection,C#,Reflection,是否有任何方法可以使用反射从已知类获取私有静态字段的值?是 Type type = typeof(TheClass); FieldInfo info = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Static); object value = info.GetValue(null); 这是一个领域。对于属性,将type.GetField更改为type.GetProperty。您也可以以类似的方式访问私有方法。尝试以下方法
Type type = typeof(TheClass);
FieldInfo info = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Static);
object value = info.GetValue(null);
这是一个领域。对于属性,将
type.GetField
更改为type.GetProperty
。您也可以以类似的方式访问私有方法。尝试以下方法:
Type type = typeof(MyClass);
MemberInfo[] members = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Static);
我认为这应该有效。如上所述,您可能可以使用with
::NonPublic | BindingFlags::Static
,但前提是您有权。如果您完全信任,您应该能够:
Type t = typeof(TheClass);
FieldInfo field = t.GetField("myFieldName", BindingFlags.NonPublic | BindingFlags.Static);
object fieldValue = field.GetValue(myObject);
但是,如果您在没有完全信任的系统上运行此操作,GetField调用将失败,并且无法工作。我想应该有人问一下这是否是一个好主意?它创建了对这个静态类的私有实现的依赖。私有实现可能会发生更改,无需向使用反射访问私有实现的人员发出任何通知
如果这两个类是要一起工作的,考虑将字段内部化,并在[Sult:InnalsVistiButo ]属性中添加协作类的组合。
在生产代码中,这通常是个坏主意。但是,它在单元测试时非常有用,因为您可以编写测试,而不必公开您希望保持私有的字段。@AVee:对于单元测试,将字段设置为internal
并使用InternalsVisibleTo
。更好的是,单元测试不应该测试实现,而应该测试正确的行为。通过依赖私有字段,现在如果类实现发生变化,单元测试就会中断。我同意@JohnSaunders这样的反射非常脆弱。尽管在某些情况下,它应该作为临时解决方案存在——例如,生产代码已经发布,但我需要一个特殊的实用程序来运行一些验收测试。我只能通过反射访问私有静态字段来实现这一点。此代码将更改,反射的类将被修改,以允许新实用程序在下一版本中所需的交互。值得注意的是,还可以通过info.SetValue(null,value)
分配静态字段。我使用此答案将值设置为静态字段。MemberInfo没有GetValue(…)
或SetValue(…)
方法。成员通常是实际的方法/函数。