PropertyInfo.GetSetMethod(true) не возвращает метод для свойств из базового класса

У меня есть следующая тестовая программа:

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?

3 ответа

Вы можете достичь этого, получив 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();
    }
}

Это по замыслу. Установщик свойства FooBase недоступен в классе Foo, что бы вы ни пытались:

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

Вам нужно будет использовать typeof(FooBase).GetProperty("Prop") в вашем коде.

РЕДАКТИРОВАТЬ

Сожалею,

Вы правы в своем комментарии ниже. Ошибка другая. В классе Foo нет метода set, поэтому он не возвращает метод. Его нет, потому что он является частным в базовом классе.

Другие вопросы по тегам