Я столкнулся со странным поведением в.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 явно наследуется!