【问题标题】:How do I set value of a class' private member's public field via Reflection?如何通过反射设置类的私有成员的公共字段的值?
【发布时间】:2013-09-04 21:20:53
【问题描述】:

我有一个 C# 类,如下所示:

public class MyClass { 
  private Member member; 

  public MyClass() { 
    member = new Member(); 
  }

  //.. other properties and methods here. 
}

public class Member { 
    public String property1 { get; set; } 
    public bool isSet { get; set; } 
    // other things to do. 
}

现在,通常我希望成员被暴露,像这样:

public class MyClass { 
  public Member member; 

  public Member Property { 
       get { return this.member; } 
       set { this.member = value; } 
  }

}

完成并结束。但是,在实际实现中,暴露 Member 对象会带来安全风险,并且只能由 MyClass 的处理在内部使用。我的团队更喜欢将其隐藏起来,不再使用,也不能公开使用。鉴于此,我正在通过反思来了解如何做到这一点。我打算使用 SetValue() 来创建 MyClassExtension,以进行更简洁的实现,但我得到了有关访问/修改字段的 InvalidOperationExceptions。

有人可以帮忙吗?

【问题讨论】:

    标签: c# .net oop reflection


    【解决方案1】:

    您可以使用BindingFlags 访问非公共成员:

    var v = new MyClass();
    
    var memberField = v.GetType().GetField("member",
            BindingFlags.NonPublic | BindingFlags.Instance);
    
    var member = memberField.GetValue(v);
    
    // no flags necessary for a public property
    var property1Property = member.GetType().GetProperty("property1");  
    
    property1Property.SetValue(member,"test");
    

    尽管请注意,如果暴露 Member 是一种安全风险,那么通过反射访问它同样有风险 - 事实上更是如此,因为任何错误都不会在运行时出现。

    最好确切地知道您要完成什么 - 可能还有另一种不涉及反射的方法。

    【讨论】:

      猜你喜欢
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 2014-10-27
      • 2011-08-20
      • 1970-01-01
      • 2013-04-27
      • 2019-04-22
      相关资源
      最近更新 更多