Проверка, наследуется ли универсальный класс от интерфейса - PullRequest
2 голосов
/ 31 марта 2010

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

Вот что я попробовал (обратите внимание, что рассматриваемый объект - это пользовательский контроль, который реализует MyInterface, хранящийся в массиве элементов управления, только некоторые из которых реализуют MyInterface - он не равен нулю):

if (this.controls[index].GetType().IsSubclassOf(typeof(MyInterface)))
    ((MyInterface)this.controls[index]).Event += this.Handler;

if (this.controls[index].GetType().IsAssignableFrom(typeof(MyInterface)))
    ((MyInterface)this.controls[index]).Event += this.Handler;

if (this.controls[index].GetType() == typeof(MyInterface))
    ((MyInterface)this.controls[index]).Event += this.Handler;

Все безрезультатно.

Ответы [ 2 ]

6 голосов
/ 31 марта 2010
if (typeof(MyInterface).IsAssignableFrom(this.controls[index].GetType()))
    ((MyInterface)this.controls[index]).Event += this.Handler;

У вас просто инвертировано IsAssignableFrom.


Для вашего случая, однако, лучший способ сделать этот тест заключается в следующем для улучшения производительности и ясности:

if (this.controls[index] is MyInterface)
2 голосов
/ 31 марта 2010

Я мог бы быть плотным, но ты не можешь просто сделать:

MyInterface foo = this.controls[index] as MyInterface;
if (foo != null) { /* do stuff */ }

(и, конечно, реальное MyInterface должно иметь имя, начинающееся с I)

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