如何用反射检索泛型参数

时间:2016-06-10 15:36:03

标签: c# generics reflection interface

如果我有这样的课程

interface IDeclaration<T> {...}

我应该如何实现检查我的特定类的实例是否来自IDeclaration<T>,如果是,那么在我们的特定情况下类型T是什么。

提前谢谢

1 个答案:

答案 0 :(得分:1)

IDeclaration是一个接口,而不是一个类。类可以实现此接口,而不是从中派生

要检查特定对象是否实现IDeclaration<T>接口,可以在该实例类型上调用GetInterfaces方法并搜索该特定接口,如下所示:

var instance = ...

var @interface =
    instance.GetType()
        .GetInterfaces()
        .FirstOrDefault(i =>
            i.IsGenericType &&
            i.GetGenericTypeDefinition() == typeof (IDeclaration<>));

bool is_IDeclaration = @interface != null;

要获取泛型类型参数(T),您可以使用GetGenericArguments方法,如下所示:

if (is_IDeclaration)
{
    var typeof_T = @interface.GetGenericArguments()[0];
}