2011-07-02 46 views
6

返回爲特性的方法我有以下的測試程序:PropertyInfo.GetSetMethod(真)不從基類

public class FooBase 
{ 
    public object Prop { 
    get { return null; } 
    private set { } 
    } 
} 
public class Foo :FooBase 
{ 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
    MethodInfo setMethod = typeof(Foo).GetProperty("Prop").GetSetMethod(true); 
    if (setMethod==null) 
     Console.WriteLine("NULL"); 
    else 
     Console.WriteLine(setMethod.ToString()); 
    Console.ReadKey(); 
    } 
} 

它表明「NULL」如果我運行它。如果我將屬性定義移動到Foo類,那麼我按預期工作。這是.NET中的錯誤嗎?

+0

請解釋投票,有效的問題。 – Nix

+1

我改了標題。永遠不要期待一個錯誤,但懷疑你的理解,並提出可供其他人閱讀的問題標題,以便他們明白問題是否對他們有用。順便說一句:我沒有投票,但我想它與標題有關。 –

+0

對不起,沒有內容豐富的標題。但是你的一個也不正確。我改變了正確的一個。 –

回答

3

編輯

對不起,

您在下面的評論是正確的。錯誤是不同的。 Foo類中沒有set方法,這就是爲什麼它沒有返回方法。它不在那裏,因爲它在基類中是私人的。

+0

+1擊敗了我。 – Nix

+1

不,GetProperty本身返回正確的值 - 否則在這裏會出現異常。 GetSetMethod方法不返回有效值。 –

+0

對不起,我更正了我的答案。 –

5

這是設計。該FooBase的屬性設置是不是在Foo類訪問,無論你嘗試:

public class Foo : FooBase { 
    void Test() { 
     Prop = new object(); // No 
     ((FooBase)this).Prop = new object(); // No 
    } 
} 

你必須在你的代碼中使用的typeof(FooBase).GetProperty(「道具」)。

6

您可以通過獲得的PropertyInfo對房地產,簡單的擴展方法可能是聲明類型實現它...

public static class Extensions 
{ 
    public static MethodInfo GetSetMethodOnDeclaringType(this PropertyInfo propertyInfo) 
    { 
     var methodInfo = propertyInfo.GetSetMethod(true); 
     return methodInfo ?? propertyInfo 
           .DeclaringType 
           .GetProperty(propertyInfo.Name) 
           .GetSetMethod(true); 
    } 
} 

然後調用代碼呢?

class Program 
{ 
    static void Main(string[] args) 
    { 
     MethodInfo setMethod = typeof(Foo) 
           .GetProperty("Prop") 
           .GetSetMethodOnDeclaringType(); 
     if (setMethod == null) 
      Console.WriteLine("NULL"); 
     else 
      Console.WriteLine(setMethod.ToString()); 
     Console.ReadKey(); 
    } 
}