PropertyInfo.GetSetMethod (true) не возвращает метод для свойств из базового класса - PullRequest
6 голосов
/ 02 июля 2011

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

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 ]

6 голосов
/ 03 августа 2011

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

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

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

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

3 голосов
/ 02 июля 2011

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

Извините,

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...