2011-07-02 13 views
6

gelen özellikleri için yöntem dönen değil:PropertyInfo.GetSetMethod (doğru) Ben test programı şu var temel sınıf

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(); 
    } 
} 

Ve bunu çalıştırırsanız o "NULL" gösterir. Özellik tanımını Foo sınıfına taşırsam, beklediğim gibi çalışır. .NET'de bu bir hata mı?

+0

Lütfen Aşağı oyu, geçerli soruyu açıklar. – Nix

+1

Başlığı değiştirdim. Asla bir hata beklemeyin, ancak anladığınızdan şüphelenin ve başkaları için okunabilen soru başlıkları hazırlayın, böylece sorunun onlar için ilginç olup olmadığını anlayın. BTW: Oy kullanmadım ama sanırım bu başlık ile ilgili. –

+0

Bilgilendirici başlık için özür dilerim. Ama senin de doğru değildi. Birini düzeltmek için değiştim. –

cevap

3

DÜZENLEME

Maalesef

Aşağıdaki yorumunuzda doğrudur. Hata farklı. Foo sınıfında ayarlanmış bir yöntem yoktur, bu yüzden bir yöntem döndürmüyor. Ana sınıfta özel olduğu için orada değil.

+0

+1 onu bana dövdü. – Nix

+1

Hayır, GetProperty'nin kendisi doğru değeri döndürür - aksi halde burada istisna olacaktır. GetSetMethod yöntemi geçerli bir değer döndürmez. –

+0

Üzgünüm, cevabımı düzelttim. –

5

Bu, tasarım gereğidir.

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

Kodunuzdaki typeof (FooBase) .GetProperty ("Prop") kullanmak gerekecektir: FooBase özellik kurucu denemek ne olursa olsun, Foo sınıfındaki erişilemez.

6

Sen mülkiyet, basit uzantısı yöntemi olabilir ait ilan tipine PropertyInfo alarak bunu başarabilir ...

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); 
    } 
} 

ardından çağıran kod yapar ...

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(); 
    } 
}