Давайте предположим, что существует класс с виртуальным свойством (давайте назовем его 'P'). Это переопределяется в происходящем классе. Теперь я хочу использовать что-то вроде этого: obj.GetType().GetProperty("P")
получить информацию о переопределяющем свойстве. Этот поиск неоднозначен, потому что существует два свойства "P" (основа и переопределение). Таким образом, я ввел: obj.GetType().GetProperty("P", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance)
Это возвращает переопределение "P" только, но что, если я не могу предположить во время компиляции, если существует переопределение вообще? Последний вызов возвратил бы пустой указатель. Случай еще более сложен, если иерархия наследования больше.
Другими словами, я хочу получить 'самое верхнее' доступное переопределение, иначе - основное свойство. Что самый чистый путь состоит в том, чтобы достигнуть цели? Только один, который я знаю в данный момент, должен пройти все свойства и имя проверки и объявление типа.
В принципе, я согласен с Мартином: BindingFlags.FlattenHierarchy
, вероятно, то, что вам нужно. Однако я думаю, что они должны использоваться вместо из BindingFlags.DeclaredOnly
, т.е.
Type type = obj.GetType();
var c = type.GetProperty("P", BindingFlags.FlattenHierarchy |
BindingFlags.Public |
BindingFlags.Instance);
Затем вы можете использовать c.DeclaringType
, чтобы узнать, на каком уровне недвижимость была задекларирована.
Если указать DeclaredOnly
, а тип , тип
не объявляет (но наследует) P
, возвращается null
.
Вы пытались добавить BindingFlags.FlattenHierarchy ?