如何读取受保护的成员

4

我想访问类中的受保护成员。有简单的方法吗?


7
大多数情况下,它之所以被保护,是有原因的... - Mehrdad Afshari
你访问受保护成员的类与拥有该成员的类之间有什么关系? - MerickOWA
3
当设计不好时,我们就需要破解它了,对吧? :) 糟糕的设计有时超出了我们的控制。 - the_drow
4个回答

9
有两种方法:
  1. 创建类的子类以访问其受保护成员。
  2. 使用反射。

仅当您控制类实例的创建者时,#1 才有效。如果已经构造好一个实例并交给您处理,则 #2 是唯一可行的解决方案。

个人建议,在使用反射之前,先确保已经尝试了所有其他可能的实现机制。


1

我有时需要做到这一点。当使用WinForms时,您希望访问系统类中的某些值,但由于它们是私有的,无法访问。为了解决这个问题,我使用反射来访问它们。例如...

    // Example of a class with internal private field
    public class ExampleClass
    {
        private int example;
    }

    private static FieldInfo _fiExample;

    private int GrabExampleValue(ExampleClass instance)
    {
        // Only need to cache reflection info the first time needed               
        if (_fiExample == null)
        {
            // Cache field info about the internal 'example' private field
            _fiExample = typeof(ExampleClass).GetField("example", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetField);
        }

        // Grab the internal property
        return (int)_fiExample.GetValue(instance);
    }

0

如果你可以从拥有受保护成员的类派生出来,那么你就可以访问它。
至于使用反射,这可能会有所帮助


0

你是否选择了正确的成员访问器?

  1. protected (C# 参考文档);
  2. public (C# 参考文档);
  3. private (C# 参考文档);
  4. internal (C# 参考文档)
  5. 你也可以将internalprotected结合使用。

毫无疑问,protected访问器指定一个成员只能在派生类中访问。因此,如果你的目标是在派生类之外访问它,也许你应该考虑使用publicinternal访问器!?

此外,这可以通过 Reflection (C# 和 Visual Basic) 实现。
另一方面,如果你真的想要暴露类的 protected 成员,我建议使用 public 成员并通过它返回对 protected 成员的引用。
但是,请在暴露 protected 成员之前先问问自己是否设计良好。在我看来,这似乎是一种设计上的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接