有没有办法使用反射从已知类中获取私有静态字段的值?
是的。
Type type = typeof(TheClass);
FieldInfo info = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Static);
object value = info.GetValue(null);
这是针对字段的说明。如果是属性,请将type.GetField
更改为type.GetProperty
。您也可以以类似的方式访问私有方法。
我想有人应该问一下这是不是一个好主意?它会创建对此静态类的私有实现的依赖。私有实现可能会在没有通知使用反射访问私有实现的人的情况下发生更改。
如果这两个类是为了配合工作而设计的,请考虑将字段设置为internal,并在[assembly:InternalsVisibleTo]属性中添加协作类的程序集。
System.Type :: GetMembers()
与BindingFlags
::NonPublic | BindingFlags :: Static
,但只有在您拥有正确的ReflectionPermission
的情况下才能使用。Type t = typeof(TheClass);
FieldInfo field = t.GetField("myFieldName", BindingFlags.NonPublic | BindingFlags.Static);
object fieldValue = field.GetValue(myObject);
然而,如果您在没有完全信任的系统上运行此代码,则 GetField 调用将失败,并且代码将无法正常工作。
Type type = typeof(MyClass);
MemberInfo[] members = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Static);
我认为这应该可以工作。
GetValue(...)
وˆ–SetValue(...)
و–¹و³•م€‚وˆگه‘کو›´ه¸¸è§پçڑ„وک¯ه®é™…çڑ„و–¹و³•/ه‡½و•°م€‚ - IAbstract
info.SetValue(null, value)
进行赋值。我使用了这个答案来给一个静态字段设置值。 - IAbstract