繼承

2013-06-28 62 views
4

以下範圍內獲得酒店的私人二傳手是我的代碼:繼承

class Foo 
{ 
    public string Bar { get; private set; } 
} 

var prop = typeof(Foo).GetProperty("Bar"); 
if (prop != null) 
{ 
    // The property exists 
    var setter = prop.GetSetMethod(true); 
    if (setter != null) 
    { 
     // There's a setter 
     Console.WriteLine(setter.IsPublic); 
    } 
} 

是的,你可以想像,這個工程完全正確的。但是當談到一個繼承的東西是不同的:

class Foo 
{ 
    public string Bar { get; private set; } 
} 

class A : Foo 
{ 

} 
當然

我改變了這一行:

var prop = typeof(Foo).GetProperty("Bar"); 

var prop = typeof(A).GetProperty("Bar"); 

然後,二傳手到達空和控制檯什麼也不印!

所以...爲什麼?

順便說一句,是否有一些解決方法,使這種情況發生或完全另一種方式?

任何幫助,將不勝感激。謝謝。

回答

2

所以...爲什麼?

至於A而言,Bar是隻讀的 - 你不能從A調用制定者,所以它有一定道理,有沒有二傳手當你問的財產相對於A

一種替代方法是使用綁定標誌僅請求聲明的屬性 - 並沿着繼承鏈繼續前進直到找到實際的屬性聲明。有點奇怪,你必須這樣做,但它確實有一定的意義,因爲屬性不同,這取決於你是否從聲明類的上下文中獲得它。

我是感到驚訝這種行爲 - 但不是震驚

0

即使您無法獲取set方法,您也可以通過僅使用屬性信息中的SetValue方法來設置具有反射的私有屬性。

3

一般的解決方法是調用

var prop = GetType().GetProperty("Bar").DeclaringType.GetProperty("Bar"); 

這是不是很直觀,我同意。

+0

也許你需要在這裏遞歸。層次結構可以是任何可能的。 – pinopino

+0

否,除非在層次結構的某個級別使用'new'運算符,否則在爲'Bar'屬性調用'DeclaringType'時總是要獲得'typeof(Foo)'。其實即使你使用'new',它也可能起作用。 –

+0

我寫了一些代碼來證明,是的你是對的。但是,當我使用'new'運算符時,DeclaringType不再是typeof(Foo),它的typeof(A),下面是我的代碼(只是層次結構):'class Foo {string} ;私人設置; } } class A:Foo { public new string Bar {get;私人設置; } } B類:A { } – pinopino