【问题标题】:How to get the value of a private static field from a class?如何从类中获取私有静态字段的值?
【发布时间】:2010-10-12 08:03:24
【问题描述】:

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

【问题讨论】:

    标签: c# reflection


    【解决方案1】:

    是的。

    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) 分配。我用这个答案为静态字段设置了一个值。
    【解决方案2】:

    我想有人应该问这是否是个好主意?它创建了对这个静态类的私有实现的依赖。私有实现如有更改,恕不另行通知使用反射访问私有实现的人。

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

    【讨论】:

    • 在生产代码中,这通常是个坏主意。然而,它在单元测试时非常有用,因为您可以编写测试而无需公开您宁愿保持私有的字段。
    • @AVee:对于单元测试,将字段设为internal 并使用InternalsVisibleTo。更好的是,单元测试不应该测试实现,只测试正确的行为。通过依赖私有字段,现在如果类实现发生变化,单元测试将中断。
    • 我同意@JohnSaunders 这样的反思非常脆弱。在某些情况下,它应该作为临时解决方案存在 - 即生产代码已经发布,但我需要一个特殊的实用程序来运行一些验收测试。我只能通过反射访问私有静态字段来实现这一点。此代码将更改,并且反射类将被修改以允许下一个版本中新实用程序所需的交互。
    【解决方案3】:

    如上所述,您可能可以将System.Type::GetMembers()BindingFlags::NonPublic | BindingFlags::Static 一起使用,但前提是您拥有正确的ReflectionPermission

    【讨论】:

      【解决方案4】:

      如果你完全信任,你应该可以做到:

      Type t = typeof(TheClass);
      FieldInfo field = t.GetField("myFieldName", BindingFlags.NonPublic | BindingFlags.Static);
      object fieldValue = field.GetValue(myObject);
      

      但是,如果您在没有完全信任的系统上运行它,则 GetField 调用将失败,这将不起作用。

      【讨论】:

        【解决方案5】:

        试试这样的:

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

        我认为这应该可行。

        【讨论】:

        • MemberInfo 没有 GetValue(...)SetValue(...) 方法。成员通常是实际的方法/函数。
        猜你喜欢
        • 2014-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-13
        • 1970-01-01
        • 1970-01-01
        • 2020-11-12
        • 1970-01-01
        相关资源
        最近更新 更多