【问题标题】:Get protected property value of base class using reflection使用反射获取基类的受保护属性值
【发布时间】:2015-08-24 14:08:40
【问题描述】:

我想知道是否可以访问位于对象基类中且是私有的 ConfigurationId 属性的值。我试图通过反思来做到这一点,但没有运气。

【问题讨论】:

  • 您能准确地发布您尝试过的内容以及出错的地方吗? (代码不是截图)
  • 不得不绕过可访问性修饰符通常是糟糕设计的标志。你想做什么,为什么?这是用于自动化测试还是什么?

标签: c# dictionary


【解决方案1】:

要访问 ConfigurationId 属性,我使用了以下代码:

SubsetController controller = new SubsetController(new CConfigRepository(new FakeDataContextRepository()));

var myBaseClassProtectedProperty=
            controller.GetType().BaseType
                .GetProperty("CCITenderInfo", BindingFlags.NonPublic | BindingFlags.Instance)
                .GetValue(controller);

var myProtectedProperty =
            CCITenderInfo.GetType()
                .GetProperty("ConfigurationId", BindingFlags.Public |     BindingFlags.Instance)
                .GetValue(myBaseClassProtectedProperty);

【讨论】:

    【解决方案2】:

    假设如下父子类:

    class BaseClass
    {
        private string privateField = "I'm Private";
    }
    
    class ChildClass : BaseClass
    {
    
    }
    

    您可以使用反射从ChildClass 实例中读取privateField 的值,如下所示:

    ChildClass childInstance = new ChildClass();
    object privateFieldValue = childInstance.GetType().BaseType
        .GetField("privateField", BindingFlags.NonPublic | BindingFlags.Instance)
        .GetValue(childInstance);
    Console.WriteLine(privateFieldValue); // I'm Private
    

    【讨论】:

    • 您为什么使用实例和.GetType() 而不是typeof 运算符?请注意,这会使您的示例或至少部分与抽象、通用和静态类不兼容
    • @Aravol 这只是在运行时获取对象实例的类型和基类的示​​例。当然它与抽象类和静态类不兼容,你不可能有这些的实例:)
    【解决方案3】:

    是的,这可以通过反射实现。

    但是,为了查找非公共成员,您需要使用带有BindingFlags 参数的反射重载。为了查找private 成员,您还需要通过基类typeof 访问,即使使用BindingFlags.FlattenHierarchy。这也意味着您需要使用精确绑定,但请注意,矛盾的标志(例如同时使用 NonPublicPublic)是有效的,并且会在此时返回。

    请注意,查找非公共成员的非常需要可能被视为代码异味,您应该非常谨慎地这样做。另请注意,不保证非公共成员在不同版本中具有相同的名称。

    【讨论】:

      猜你喜欢
      • 2016-05-27
      • 2019-12-30
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 2011-09-12
      • 2012-01-22
      相关资源
      最近更新 更多