考虑通用接口
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>
)
我如何通过反思来实现这一目标?
答案 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