Отражение производных классов в C # - PullRequest
5 голосов
/ 01 мая 2010

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

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

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

Ответы [ 2 ]

3 голосов
/ 01 мая 2010

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

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

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

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

1 голос
/ 01 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...