Благодаря отражению новое ключевое слово скрывает унаследованное свойство, только если подпись совпадает. Я думаю, что отражение соответствует подписи на средствах доступа к свойствам (get_ & set_). Это причины, по которым GetProperties()
возвращает B.P и C.P, если тип возвращаемого значения отличается.
Я недавно обнаружил Fasteflect , который обеспечивает усовершенствованные механизмы отражения.
Я проверил, и Fasteflect type.Properties
возвращает все дерево скрытых элементов (P). Я думаю, что API рассматривает поддержку участников (виртуальных / переопределенных) и скрытых (новых) по-разному, что хорошо для вашей «проблемы»;)
Мой тест с более быстрым ответом:
class Class1
{
public object field1 = null;
public virtual object Property1 { get; set; }
public object Property2 { get; set; }
public string Property3 { get; set; }
}
class Class2 : Class1
{
public new object field1 = null;
public override object Property1 { get; set; }
public new string Property3 { get; set; }
}
class Class3 : Class2
{
public new string Property3 { get; set; }
}
Отфильтровать поддерживающих участников, но возвращает всех скрытых членов:
typeof(Class3).Properties(Flags.ExcludeBackingMembers | Flags.Public | Flags.Instance)
- typeof (Class3) .Properties (Flags.ExcludeBackingMembers | Flags.Public | Flags.Instance) Count = 5 System.Collections.Generic.IList
[0] {System.String Property3} System.Reflection.PropertyInfo
[1] {System.Object Property1} System.Reflection.PropertyInfo
[2] {System.String Property3} System.Reflection.PropertyInfo
[3] {System.Object Property2} System.Reflection.PropertyInfo
[4] {System.String Property3} System.Reflection.PropertyInfo