【发布时间】:2010-12-20 05:51:28
【问题描述】:
好的,假设我们定义了一个类
public class TestClass
{
private string MyPrivateProperty { get; set; }
// This is for testing purposes
public string GetMyProperty()
{
return MyPrivateProperty;
}
}
那我们试试:
TestClass t = new TestClass { MyPrivateProperty = "test" };
编译失败,TestClass.MyPrivateProperty is inaccessible due to its protection level 符合预期。
试试
TestClass t = new TestClass();
t.MyPrivateProperty = "test";
编译再次失败,显示相同的消息。
到目前为止一切都很好,我们期待这一点。
然后写一个:
PropertyInfo aProp = t.GetType().GetProperty(
"MyPrivateProperty",
BindingFlags.NonPublic | BindingFlags.Instance);
// This works:
aProp.SetValue(t, "test", null);
// Check
Console.WriteLine(t.GetMyProperty());
在这里,我们设法更改了一个私有字段。
仅仅通过反射就可以改变某个对象的内部状态是不是很不正常?
编辑:
感谢到目前为止的回复。对于那些说“你不必使用它”的人:类设计师呢,看起来他不能再假设内部状态安全了?
【问题讨论】:
-
仅仅使用反射?有人不只是使用反射,他确切地知道,他正在破坏 API。
标签: c# oop reflection