Я ищу решение для доступа к «сплющенным» (наименьшим) значениям свойств класса и его производным путем отражения именами свойств.
т.е. доступ к Property1 или Property2 из ClassB или ClassC типа:
public class ClassA
{
public virtual object Property1 { get; set; }
public object Property2 { get; set; }
}
public class ClassB : ClassA
{
public override object Property1 { get; set; }
}
public class ClassC : ClassB
{
}
Использование простого отражения работает, пока у вас не будут переопределены виртуальные свойства (например, Property1 из ClassB ). Затем вы получаете AmbiguousMatchException , потому что поисковик не знает, хотите ли вы свойство основного класса или производного.
Использование BindingFlags.Declared. Только избегайте AmbiguousMatchException, но не переопределенные виртуальные свойства или свойства производных классов опускаются (т. Е. Property2 из ClassB ).
Есть ли альтернатива этому плохому обходному пути:
// Get the main class property with the specified propertyName
PropertyInfo propertyInfo = _type.GetProperty(propertyName, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
// If not found, get the property wherever it is
if (propertyInfo == null)
propertyInfo = _type.GetProperty(propertyName);
Кроме того, этот обходной путь не разрешает отражение свойств 2-го уровня: получение Property1 из ClassC и AmbiguousMatchException возвращается.
Мои мысли: у меня нет выбора, кроме петли ... Эрк ... ??
Я открыт для Emit, Lambda (Expression.Call может справиться с этим?), Даже решение DLR.
Спасибо!