好吧,讓我們說我們有一個類像反射破壞封裝原理嗎?
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。 – 2009-11-25 10:46:25