基本接口的通用类型

时间:2017-02-06 13:48:35

标签: c# generics reflection .net-core

我的班级结构(简化)

interface Foo<T> { }
abstract class Bar1 : Foo<SomeClass> { }
abstract class Bar2 : Foo<SomeOtherClass> { }
class FinalClass1 : Bar1 { }
class FinalClass2 : Bar2 { }

现在,只有类型FinalClass1和FinalClass2我需要从Foo接口获取它们各自的T类型 - FinalClass1的SomeClass和FinalClass2的SomeOtherClass。抽象类可以实现更通用的接口,但总是只有一个Foo。

  1. 如何使用反射来实现这一目标?

  2. 我怎样才能确保该类型正在实现Foo而不管T是什么类型?像

  3. 这样的东西

    bool bIsFoo = typeof(SomeType).IsAssignableFrom(Foo<>)

    以上不起作用。

1 个答案:

答案 0 :(得分:5)

搜索通用接口的类型接口Foo<>。然后得到该接口的第一个泛型参数:

type.GetInterfaces()
    .FirstOrDefault(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(Foo<>))
    ?.GetGenericArguments().First();

如果要检查类型是否正在实施Foo<>

type.GetInterfaces()
    .Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(Foo<>))