【问题标题】:Check if object implements specific generic interface检查对象是否实现了特定的通用接口
【发布时间】:2026-01-31 22:10:01
【问题描述】:

我有多个类(为了解释目的而进行了简化):

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&lt;&gt;),像这样:

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

但是,我不知道如何检查对象是否实现了特定的通用接口(实现 IHandleEvent&lt;Event1&gt;)。那么,如何在 if 中检查呢?

【问题讨论】:

  • 除了直接回答您的问题(克里斯已经建议使用 is 运算符),我强烈建议您重新考虑设计。如果基类应该知道派生类(但不是所有派生类),那么您可能需要实现所需接口并用于覆盖派生类子集的第二级基类。如果你这样想,你可能也会更好地理解你正在建模的问题。

标签: c# generics types interface implementation


【解决方案1】:

只需给我们isas 运算符:

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

或者,如果类型参数在编译时未知:

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

【讨论】:

  • 完美!在运行时带有 type 参数的第二个确实是我正在寻找的。编辑:另外,ReSharper 说我应该将 t.IsAssignableFrom(this.GetType()) 替换为 type.IsInstanceOfType(this)
  • @KevinCruijssen IIRC IsInstanceOfType 只是调用IsAssignableFrom,所以无论哪种方式都可以!