[英]PropertyDescriptor and inheritance
我正在使用TypeDescriptor.GetProperties(instance)
,它從基類返回我的所有屬性和get / set方法。
我有基礎課:
public class Foo
{
public virtual string Name
{
get => _name;
set => _name = value;
}
}
派生類:
public class Bar : Foo
{
public override string Name => "Test";
}
當我獲取“名稱”屬性的信息時, PropertyDescriptor.IsReadOnly
等於“ false”,但應為“ true”。 如何設置“ PropertyDescriptor”,使其僅返回派生類類型的數據?
這與繼承無關。 您獲得的PropertyDescriptor
對象確實描述了Bar
的屬性。
IsReadOnly
標志為false
的事實與繼承無關。 而是它告訴您該屬性實際上不是只讀的。
您可能會問“但是為什么?”
在您的代碼中,實際上您僅覆蓋了該屬性的get
訪問器。 set
訪問器實現只是從基Foo
類繼承而來。
您可以輕松地編寫如下內容:
Bar bar = new Bar();
bar.Name = "dummy";
這將編譯並在內部工作_name
后備字段將設置為提供的值。
但是,此代碼很危險,因為無論您通過bar.Name = "string value here"
進行了什么設置, bar.Name
都將始終返回"Test"
bar.Name = "string value here"
。 此外,此代碼違反了Liskov替換原理,因為子類Bar
的行為不同於基類Foo
的公共接口聲明的行為。
只讀屬性意味着您無法設置其值,因此編譯器甚至不允許您編寫bar.Name = "text"
。 但是它確實允許您這樣做。 在您的情況下,該屬性不是只讀的,它具有錯誤的(錯誤的)實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.