【发布时间】:2010-10-12 08:03:24
【问题描述】:
有没有办法使用反射从已知类中获取私有静态字段的值?
【问题讨论】:
标签: 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。您也可以以类似的方式访问私有方法。
【讨论】:
info.SetValue(null, value) 分配。我用这个答案为静态字段设置了一个值。
我想有人应该问这是否是个好主意?它创建了对这个静态类的私有实现的依赖。私有实现如有更改,恕不另行通知使用反射访问私有实现的人。
如果这两个类要一起工作,请考虑将字段设置为 internal 并在 [assembly:InternalsVisibleTo] 属性中添加合作类的程序集。
【讨论】:
internal 并使用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(...) 方法。成员通常是实际的方法/函数。