Странный эффект с переопределенными свойствами и отражением

Я столкнулся со странным поведением в.NET / Reflection и не может найти никакого решения / объяснения для этого:

class A 
{
   public virtual string TestString { get; set; }
}

class B : A
{
   public override string TestString
   {
      get { return "x"; }
   }
}

Поскольку свойства - это просто пары функций ( get_PropName () , set_PropName () ), переопределяющие только «get» часть должна оставить "установленную" часть такой, как она есть в базовом классе. И это именно то, что происходит, если вы пытаетесь создать экземпляр класса B и присвоить значение TestString , он использует реализацию класса A.

Но что произойдет, если я посмотрю на созданный экземпляр объекта класса B в отражении это:

PropertyInfo propInfo = b.GetType().GetProperty("TestString");
propInfo.CanRead  ---> true
propInfo.CanWrite ---> false(!)

И если я попытаюсь вызвать сеттер из отражения с помощью:

propInfo.SetValue("test", b, null);

, я даже получу ArgumentException со следующим сообщением:

Метод набора свойств не найден.

Это как ожидалось? Потому что я, похоже, не нашел комбинацию BindingFlags для метода GetProperty () , который возвращает мне свойство с рабочей парой получения / установки из отражения.

РЕДАКТИРОВАТЬ: Я ожидал бы такого поведения, если бы использовал BindingFlags.DeclaredOnly для GetProperties () , но по умолчанию ( BindingFlags.Default ) учитывает унаследованные члены, а установщик TestString явно наследуется!

13
задан naacal 15 November 2011 в 20:08
поделиться