2017-09-22 104 views
0

我使用的是TypeDescriptor.GetProperties(instance),它從基類返回所有屬性和get/set方法。PropertyDescriptor和繼承

我有基類:

public class Foo 
{ 
    public virtual string Name 
    { 
     get => _name; 
     set => _name = value; 
    } 
} 

Derrived類:

public class Bar : Foo 
{ 
    public override string Name => "Test"; 
} 

當我得到了 '名稱' 屬性PropertyDescriptor.IsReadOnly信息等於 '假',但它應該是「真」。 我該如何設置'PropertyDescriptor',這樣它會返回我的數據只用於耙類類型?

+0

可能重複[獲取通過類的反射屬性,但不是從繼承類](https://stackoverflow.com/questions/7596162/get-by-reflection-properties-of-class-but-not-from -herherited-class) –

+0

@BradleyUffner nope,那不是我的情況。 – Sigin

+0

啊,對不起,你說得對。撤回近距離投票。 –

回答

0

這與繼承無關。 PropertyDescriptor對象你得到確實描述Bar的財產。

IsReadOnly標誌爲false的事實與繼承無關。而是它告訴你,該屬性是其實不是隻讀。

你可能會問「但爲什麼?」

在你的代碼中,你實際上只覆蓋了屬性的get訪問器。 set訪問器實現只是繼承自基類Foo類。

您可以輕鬆地編寫類似:

Bar bar = new Bar(); 
bar.Name = "dummy"; 

這將彙編和內部做工太 - _name支持字段將被設置爲提供的值。

但是,由於bar.Name將始終返回​​,無論您通過bar.Name = "string value here"設置了什麼,此代碼都是危險的。此外,該代碼打破了Liskov替換原則,因爲子類Bar的行爲與基類Foo的公共接口所述的行爲不同。

A 只讀屬性意味着你不能設置它的值,所以編譯器甚至不會允許你寫bar.Name = "text"。但它確實可以讓你做到這一點。你的情況屬性不是隻讀的,它有一個錯誤的(破碎的)實現。

+0

OK。讓我們認爲它不是隻讀的,比我調用InstanceOfTypeBar.GetType()。GetProperty(「Name」).CanWrite'應該是'true',但實際上它是'false'。 – Sigin

+0

@Sigin,你可以看看[這裏](https://stackoverflow.com/questions/8140298/strange-effect-with-overridden-properties-and-reflection)。您的財產是**不**只讀,'CanWrite'的錯誤值是一個副作用。 – dymanoid

+0

我明白你的意思,但它不能解決我的問題。 – Sigin