Intereting Posts
Перенаправление MVC с пользовательскими заголовками Является ли xslt хорошим подходом для преобразования текста в структуру xml? Найти общедоступные и закрытые ключи с помощью RSACryptoServiceProvider в c # Сохранение файла JPEG, поступающего из сети RTP Stream EF получает список записей во время выполнения от типа Соединение сокета было прервано – CommunicationException Как я могу изменить соглашения об именах controllerов в Asp.NET MVC? Как измерить охват кода в проектах ASP.NET Core в Visual Studio? Установка других приложений с нашей настройкой – vs2010 Развертывание приложений для настольных компьютеров событие вкладки winforms не запускается Могу ли я указать значимое имя для анонимного classа в C #? SOAP с использованием C # Как определить, находится ли мышь внутри всей формы и дочерних элементов управления? Побитовое или оператор, используемый в расширенном расширении в Visual Studio 2015 Чтобы получить определенную часть строки в c #

Отражение всех свойств интерфейса, включая унаследованные?

У меня есть экземпляр System.Type, который представляет собой интерфейс, и я хочу получить список всех свойств этого интерфейса, включая те, которые унаследованы от базовых интерфейсов. В основном я хочу того же поведения с интерфейсами, которые я получаю для classов.

Например, учитывая эту иерархию:

public interface IBase { public string BaseProperty { get; } } public interface ISub : IBase { public string SubProperty { get; } } public class Base : IBase { public string BaseProperty { get { return "Base"; } } } public class Sub : Base, ISub { public string SubProperty { get { return "Sub"; } } } 

Если я вызываю GetProperties в classе – typeof(Sub).GetProperties() – тогда я получаю как BaseProperty, так и SubProperty. Я хочу сделать то же самое с интерфейсом, но когда я его попробую – typeof(ISub).GetProperties() – все, что возвращается, это SubProperty.

Я пробовал пропустить BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy для GetProperties, так как мое понимание FlattenHierarchy заключается в том, что он должен включать членов из базовых classов, но поведение было точно таким же.

Я предполагаю, что я мог бы итерации Type.GetInterfaces() и вызывать GetProperties на каждом из них, но тогда я бы полагался на GetProperties на интерфейсе, чтобы никогда не возвращать базовые свойства (поскольку, если бы это когда-либо было, я бы получил дубликаты). Я бы предпочел не полагаться на это поведение, по крайней мере, не задокументировав его.

Как я могу:

  • Получить список всех свойств интерфейса, в том числе и его базовых интерфейсов? Или же
  • По крайней мере, быть уверенным, что то, что я вижу, – это документированное поведение, на которое я могу положиться, поэтому я могу обойти его?

Ответ сортировки можно найти в annotations к .NET-версии версии 3.5 для MSDN на основе GetProperties(BindingFlags bindingFlags) :

Передача BindingFlags.FlattenHierarchy к одному из методов Type.GetXXX, например Type.GetMembers, не будет возвращать унаследованные элементы интерфейса при запросе на сам тип интерфейса.

[…]

Чтобы получить унаследованные члены, вам нужно запросить каждый реализованный интерфейс для своих членов.

Пример кода также включен. Этот комментарий был отправлен Microsoftie, поэтому я бы сказал, что вы можете доверять ему.

См. Здесь: GetProperties () для возврата всех свойств иерархии наследования интерфейсов

Я не думаю, что можно получить всех участников, не выполняя то, что вы предложили (т. Е. Получить все интерфейсы реализации).