Я столкнулся со странным поведением в .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", она должна оставить часть "set", как и в базовом классе. И это именно то, что происходит, если вы пытаетесь создать экземпляр класса B и присвоить значение TestString
, он использует реализацию класса A.
Но что произойдет, если я посмотрю на экземпляр объекта класса B в отражении, это:
PropertyInfo propInfo = b.GetType().GetProperty("TestString");
propInfo.CanRead ---> true
propInfo.CanWrite ---> false(!)
И если я попытаюсь вызвать сеттер из отражения с помощью:
propInfo.SetValue("test", b, null);
Я даже получу ArgumentException
со следующим сообщением:
Метод набора свойств не найден.
Это как и ожидалось? Потому что мне кажется, что я не могу найти комбинацию BindingFlags
для метода GetProperty()
, которая возвращает мне свойство с работающей парой get / set из отражения.
EDIT:
Я ожидал бы такого поведения, если бы использовал BindingFlags.DeclaredOnly
на GetProperties()
, но значение по умолчанию (BindingFlags.Default
) учитывает унаследованные элементы, и установщик TestString явно наследуется!