2015-08-11 7 views
0

У меня есть несколько классов (упрощено для объясняющих целей):Проверьте объект реализует конкретный общий интерфейс

public class A : BaseClass, 
    IHandleEvent<Event1>, 
    IHandleEvent<Event2> 
{ 
} 

public class B : BaseClass, 
    IHandleEvent<Event3>, 
    IHandleEvent<Event4> 
{ 
} 

public class C : BaseClass, 
    IHandleEvent<Event2>, 
    IHandleEvent<Event3> 
{ 
} 

В моем «BaseClass» У меня есть метод, где я хочу, чтобы проверить, действительно ли орудия детей класса IHandleEvent конкретного события.

public void MyMethod() 
{ 
    ... 
    var event = ...; 
    ... 
    // If this class doesn't implement an IHandleEvent of the given event, return 
    ... 
} 

От this SO-answer Я знаю, как проверить, если объект реализует общий интерфейс (орудия IHandleEvent<>), как это:

if (this.GetType().GetInterfaces().Any(x => 
    x.IsGenericType && x.GenericTypeDefinition() == typeof(IHandleEvent<>))) 
{ 
    ... // Some log-text 
    return; 
} 

Но, я не знаю, как проверить, если объект реализует ОСОБЫЙ общий интерфейс (реализует IHandleEvent<Event1>). Итак, как это можно проверить в if?

+0

Нечто подобное http://stackoverflow.com/ questions/31855832/how-to-define-if-class-inherits-dictionary? – Eser

+0

Помимо прямого ответа на ваш вопрос (Крис уже предложил использовать оператора is), я настоятельно рекомендую вам переосмыслить дизайн. Если базовый класс должен знать о производных классах (но не всех), то может оказаться возможным, что вам нужен второй уровень базового класса, который реализует требуемый интерфейс и используется для покрытия этого подмножества производных классов. Если вы так думаете, вы также можете лучше понять проблему, которую вы моделируете. –

ответ

5

Просто с нами is или as оператор:

if(this is IHandleEvent<Event1>) 
    .... 

Или, если тип аргумента не известен во время компиляции:

var t = typeof(IHandleEvent<>).MakeGenericType(/* any type here */) 
if(t.IsAssignableFrom(this.GetType()) 
    .... 
+0

Отлично! Второй вариант с аргументом типа во время выполнения был действительно тем, что я искал. EDIT: Кроме того, ReSharper сказал, что я должен заменить 't.IsAssignableFrom (this.GetType())' to 'type.IsInstanceOfType (this)' –

+0

@KevinCruijssen IIRC 'IsInstanceOfType' просто вызывает' IsAssignableFrom', поэтому любой способ будет делать! – Chris

Смежные вопросы