簡體   English   中英

PropertyDescriptor和繼承

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM