如何通过反射设置类私有成员的公共字段的值
本文关键字:字段 成员 反射 何通过 设置 | 更新日期: 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
存在安全风险,那么通过反射访问它的风险也同样大 - 事实上风险更大,因为任何错误都要到运行时才会显示。
确切地知道您要完成什么 - 可能还有另一种不涉及反思的方法。