有没有办法通过反射从已知类中获取私有静态字段的值?
答案 0 :(得分:66)
是
Type type = typeof(TheClass);
FieldInfo info = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Static);
object value = info.GetValue(null);
这是一个字段。对于媒体资源,请将type.GetField
更改为type.GetProperty
。您也可以以类似的方式访问私有方法。
答案 1 :(得分:5)
我想有人应该问这是不是一个好主意?它创建了对此静态类的私有实现的依赖。私有实施可能会发生变化,而不会通知使用Reflection访问私有实施的人。
如果两个类要一起工作,请考虑使用 internal 字段并在[assembly:InternalsVisibleTo]属性中添加协作类的程序集。
答案 2 :(得分:2)
如上所述,您可以将System.Type::GetMembers()
与BindingFlags
::NonPublic | BindingFlags::Static
一起使用,但前提是您拥有ReflectionPermission
权利。
答案 3 :(得分:0)
如果您完全信任,您应该能够:
Type t = typeof(TheClass);
FieldInfo field = t.GetField("myFieldName", BindingFlags.NonPublic | BindingFlags.Static);
object fieldValue = field.GetValue(myObject);
但是,如果在没有完全信任的系统上运行此命令,GetField调用将失败,这将无效。
答案 4 :(得分:-1)
尝试这样的事情:
Type type = typeof(MyClass);
MemberInfo[] members = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Static);
我认为这应该有用。