Как получить базовый тип интерфейса через отражение? - PullRequest
23 голосов
/ 11 февраля 2009
public interface IBar {} 
public interface IFoo : IBar {}

typeof(IFoo).BaseType == null

Как я могу получить IBar?

Ответы [ 3 ]

51 голосов
/ 11 февраля 2009
Type[] types = typeof(IFoo).GetInterfaces();

Редактировать: Если вы специально хотите IBar, вы можете сделать:

Type type = typeof(IFoo).GetInterface("IBar");
27 голосов
/ 11 февраля 2009

Интерфейс не является базовым типом. Интерфейсы не являются частью дерева наследования.

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

typeof(IFoo).GetInterfaces()

или если вы знаете имя интерфейса:

typeof(IFoo).GetInterface("IBar")

Если вас интересует только то, является ли тип неявно совместимым с другим типом (что, я подозреваю, является тем, что вы ищете), используйте type.IsAssignableFrom (fromType). Это эквивалентно ключевому слову «is», но с типами среды выполнения.

Пример:

if(foo is IBar) {
    // ...
}

Эквивалентно:

if(typeof(IBar).IsAssignableFrom(foo.GetType())) {
    // ...
}

Но в вашем случае вас, вероятно, больше интересует:

if(typeof(IBar).IsAssignableFrom(typeof(IFoo))) {
    // ...
}
1 голос
/ 11 февраля 2009

В дополнение к тому, что написали другие авторы, вы можете получить первый интерфейс из списка GetInterface () (если список не пустой), чтобы получить прямого родителя IFoo. Это будет точным эквивалентом вашей попытки .BaseType.

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