假设有以下类型定义:

public interface IFoo<T> : IBar<T> {}
public class Foo<T> : IFoo<T> {}

我如何找出类型Foo是否实现了通用接口IBar<T>时,只有manged类型是可用的?


当前回答

通过使用tck的答案,也可以用以下LINQ查询完成:

bool isBar = foo.GetType().GetInterfaces().Any(x =>
  x.IsGenericType &&
  x.GetGenericTypeDefinition() == typeof(IBar<>));

其他回答

var genericType = typeof(ITest<>);
Console.WriteLine(typeof(Test).GetInterfaces().Any(x => x.GetGenericTypeDefinition().Equals(genericType))); // prints: "True"

interface ITest<T> { };

class Test : ITest<string> { }

这对我很管用。

以下内容应该没有任何问题:

bool implementsGeneric = (anObject.Implements("IBar`1") != null);

如果您想为IBar查询提供一个特定的泛型类型参数,您可以捕获AmbiguousMatchException。

通过使用tck的答案,也可以用以下LINQ查询完成:

bool isBar = foo.GetType().GetInterfaces().Any(x =>
  x.IsGenericType &&
  x.GetGenericTypeDefinition() == typeof(IBar<>));

方法检查类型是否继承或实现泛型类型:

   public static bool IsTheGenericType(this Type candidateType, Type genericType)
    {
        return
            candidateType != null && genericType != null &&
            (candidateType.IsGenericType && candidateType.GetGenericTypeDefinition() == genericType ||
             candidateType.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == genericType) ||
             candidateType.BaseType != null && candidateType.BaseType.IsTheGenericType(genericType));
    }

首先,公共类Foo: IFoo<T>{}不能编译,因为你需要指定一个类而不是T,但假设你做的事情类似于公共类Foo: IFoo<SomeClass> {}

如果你这样做了

Foo f = new Foo();
IBar<SomeClass> b = f as IBar<SomeClass>;

if(b != null)  //derives from IBar<>
    Blabla();