我有一个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。
有人可以帮忙吗?
答案 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
是一个安全风险,那么通过反射访问它同样有风险 - 事实上更是如此,因为任何错误都不会在运行时出现。
最好确切地知道你想要完成什么 - 可能还有另一种不涉及反思的方式。