Отражение производных классов в C#

Давайте предположим, что существует класс с виртуальным свойством (давайте назовем его 'P'). Это переопределяется в происходящем классе. Теперь я хочу использовать что-то вроде этого: obj.GetType().GetProperty("P") получить информацию о переопределяющем свойстве. Этот поиск неоднозначен, потому что существует два свойства "P" (основа и переопределение). Таким образом, я ввел: obj.GetType().GetProperty("P", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance)

Это возвращает переопределение "P" только, но что, если я не могу предположить во время компиляции, если существует переопределение вообще? Последний вызов возвратил бы пустой указатель. Случай еще более сложен, если иерархия наследования больше.

Другими словами, я хочу получить 'самое верхнее' доступное переопределение, иначе - основное свойство. Что самый чистый путь состоит в том, чтобы достигнуть цели? Только один, который я знаю в данный момент, должен пройти все свойства и имя проверки и объявление типа.

5
задан Vincent Ramdhanie 4 May 2011 в 17:15
поделиться

2 ответа

В принципе, я согласен с Мартином: BindingFlags.FlattenHierarchy , вероятно, то, что вам нужно. Однако я думаю, что они должны использоваться вместо из BindingFlags.DeclaredOnly , т.е.

Type type = obj.GetType();
var c = type.GetProperty("P", BindingFlags.FlattenHierarchy | 
                              BindingFlags.Public | 
                              BindingFlags.Instance);

Затем вы можете использовать c.DeclaringType , чтобы узнать, на каком уровне недвижимость была задекларирована.

Если указать DeclaredOnly , а тип , тип не объявляет (но наследует) P , возвращается null .

3
ответ дан 15 December 2019 в 00:54
поделиться

Вы пытались добавить BindingFlags.FlattenHierarchy ?

1
ответ дан 15 December 2019 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: