我可以使用反射更改C#中的私有只读字段吗?

我可以使用反射更改C#中的私有只读字段吗?

我想知道,由于很多事情都可以使用反射来完成,所以在构造函数完成它的执行之后,我可以更改私有只读字段吗?

(注意:只是好奇)


public class Foo

{

 private readonly int bar;


 public Foo(int num)

 {

  bar = num;

 }


 public int GetBar()

 {

  return bar;

 }

}


Foo foo = new Foo(123);

Console.WriteLine(foo.GetBar()); // display 123

// reflection code here...

Console.WriteLine(foo.GetBar()); // display 456


慕侠2389804
浏览 755回答 3
3回答

墨色风雨

你可以:typeof(Foo)    .GetField("bar",BindingFlags.Instance|BindingFlags.NonPublic)    .SetValue(foo,567);

宝慕林4294392

我同意其他答案,因为它有效。一般特别是与E.Lippert的评论,这不是记录的行为,因此不是未来的证明代码。然而,我们也注意到了另一个问题。如果在权限受限的环境中运行代码,则可能会出现异常。我们刚刚遇到了一种情况,我们的代码在机器上正常工作,但是我们收到了一个VerificationException当代码在受限的环境中运行时。罪魁祸首是对只读字段设置者的反射调用。当我们移除那个字段的只读限制时,它就起了作用。
打开App,查看更多内容
随时随地看视频慕课网APP