如何通过Reflection设置类私有成员公共字段的值?

时间:2013-09-04 21:20:54

标签: c# .net oop reflection

我有一个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。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:7)

您可以使用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是一个安全风险,那么通过反射访问它同样有风险 - 事实上更是如此,因为任何错误都不会在运行时出现。

最好确切地知道你想要完成什么 - 可能还有另一种不涉及反思的方式。