Я столкнулся с странным поведением в .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
со следующим сообщением:
Метод набора свойств не найден.
Это так, как ожидалось? Поскольку мне кажется, что для метода GetProperty()
я не нашел комбинацию BindingFlags
, которая возвращает мне свойство с помощью рабочей пары get/set из отражения.
EDIT:
Я бы ожидал такого поведения, если бы использовал BindingFlags.DeclaredOnly
в GetProperties()
, но по умолчанию (BindingFlags.Default
) учитываются унаследованные члены, и наборщик TestString явно наследуется!