Размышляя над всеми свойствами интерфейса, включая унаследованные? - PullRequest
14 голосов
/ 25 января 2010

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

Например, с учетом этой иерархии:

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 для класса - typeof(Sub).GetProperties() - тогда я получаю и BaseProperty, и SubProperty. Я хочу сделать то же самое с интерфейсом, но когда я пытаюсь это сделать - typeof(ISub).GetProperties() - все, что возвращается, это SubProperty.

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

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

Как я могу:

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

Ответы [ 2 ]

7 голосов
/ 25 января 2010

Ответ на этот вопрос можно найти в аннотации - на странице MSDN для платформы .NET Framework версии 3.5 на GetProperties(BindingFlags bindingFlags):

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

[...]

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

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

1 голос
/ 25 января 2010

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

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

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