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

本文关键字:字段 成员 反射 何通过 设置 | 更新日期: 2023-09-27 18:30:15

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

完成它并结束它。但是,在实际实现中,公开成员对象将存在安全风险,并且只能通过MyClass的处理在内部使用。我的团队更喜欢它被隐藏起来,不使用,而不是公开消费。鉴于此,我正在通过反思来了解如何做到这一点。我打算使用 SetValue() 来制作一个 MyClassExtension,做一个更干净的实现,但我得到了关于访问/修改字段的 InvalidOperationExceptions。

有人可以帮忙吗?

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

您可以使用

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存在安全风险,那么通过反射访问它的风险也同样大 - 事实上风险更大,因为任何错误都要到运行时才会显示。

最好

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