如何判断类是否实现了具有泛型类型的接口

本文关键字:泛型类型 接口 实现 是否 何判断 判断 | 更新日期: 2023-09-27 18:21:38

我有以下代码:

public interface IInput
{
}
public interface IOutput
{
}
public interface IProvider<Input, Output>
{
}
public class Input : IInput
{
}
public class Output : IOutput
{
}
public class Provider: IProvider<Input, Output>
{
}

现在我想知道Provider是否使用反射实现IProvider?我不知道该怎么做。我尝试了以下方法:

Provider test = new Provider();
var b = test.GetType().IsAssignableFrom(typeof(IProvider<IInput, IOutput>));

返回false。。

我需要帮助。我希望避免使用TypeName(String)来解决这个问题。

如何判断类是否实现了具有泛型类型的接口

测试是否实现

var b = test.GetType().GetInterfaces().Any(
    x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IProvider<,>));

要查找的,请使用FirstOrDefault而不是Any:

var b = test.GetType().GetInterfaces().FirstOrDefault(
    x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IProvider<,>));
if(b != null)
{
    var ofWhat = b.GetGenericArguments(); // [Input, Output]
    // ...
}

首先,应该使用接口而不是其定义中的类来声明IProvider

public interface IProvider<IInput, IOutput>
{
}

那么Provider类的定义应该是:

public class Provider: IProvider<IInput, IOutput>
{
}

最后,对IsAssignableFrom的调用是向后的,它应该是:

var b = typeof(IProvider<IInput, IOutput>).IsAssignableFrom(test.GetType());

我能够使用Mark的建议实现这一点。

这是代码:

(type.IsGenericType &&
                (type.GetGenericTypeDefinition() == (typeof(IProvider<,>)).GetGenericTypeDefinition()))