1

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

现在,通常我希望 Member 暴露,像这样:

public class MyClass { 
  public Member member; 

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

}

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

有人可以帮忙吗?

4

1 回答 1

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是一种安全风险,那么通过反射访问它同样有风险——事实上更是如此,因为任何错误直到运行时才会出现。

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

于 2013-09-04T21:27:58.167 回答