通过反射找到实现通用接口的类型

时间:2015-03-29 13:22:24

标签: c# reflection

考虑通用接口

public interface IA<T>
{
}

和两个实现

public class A1 : IA<string>
{}
public class A2 : IA<int>
{}

我想编写一个方法来查找实现具有特定类型

IA接口的类
public Type[] Find(IEnumerable<Type> types, Type type)

以便以下调用

Find(new List<Type>{ typeof(A1), typeof(A2)}, typeof(string))

将返回类型A1

重要提示

我可以假设作为列表传入的所有类型都会实现IA 但是不一定是直接的(例如A1可以从BaseA继承实现IA<string>

我如何通过反思来实现这一目标?

1 个答案:

答案 0 :(得分:2)

使用MakeGenericType构造一个特定的泛型类型,并检查它是否在给定类实现的接口列表中可用。

private static Type FindImplementation(IEnumerable<Type> implementations, Type expectedTypeParameter)
{
    Type genericIaType = typeof(IA<>).MakeGenericType(expectedTypeParameter);

    return implementations.FirstOrDefault(x => x.GetInterfaces().Contains(genericIaType));
}

你称之为

Type type = FindImplementation(new []{ typeof(A1), typeof(A2)}, typeof(string));
//Returns A1