我想将typeof(IEnumerable<>)与IEnumerable的各种特定类的类型进行比较,例如。
Compare(typeof(IEnumerable<>), typeof(IEnumerable<object>)) // should return true
Compare(typeof(IEnumerable<>), typeof(IEnumerable<int>)) // should return true
Compare(typeof(IEnumerable<>), typeof(IEnumerable<MyClass>)) // should return true
Compare(typeof(IEnumerable<>), typeof(IEnumerable)) // should return FALSE because IEnumerable is not the generic IEnumerable<> type
我该怎么做?对于以上所有示例,所有常见方法(如==或IsAssignableFrom)都返回false。
可能不是问题的必要条件,而是一些背景:
我正在编写一个将对象转换为其他类型的转换类。我使用的是属性(XlConverts):
public class XlConvertsAttribute : Attribute
{
public Type converts;
public Type to;
}
标记每个方法转换成的类型。我的一个转换方法将对象转换为IEnumerable:
[XlConverts(converts = typeof(object), to = typeof(IEnumerable<>))]
public static IEnumerable<T> ToIEnumerable<T>(object input)
{
// ....
}
然后我有一个更通用的方法
public static object Convert(object input, Type toType)
{
// ...
}
使用反射来获取具有XlConverts.to == toType的方法,因此基本上它反映了自己的类,以便在给定所需目标类型的情况下找到approrpaite转换方法。
现在当我调用Convert(input,typeof(IEnumerable))时,应该通过反射找到ToIEnumerable方法。但是因为我只能用[XlConverts(to = typeof(IEnumerable&lt;&gt;))和IEnumerable&lt;&gt;标记它。不是IEnumerable,它不会找到这种方法。
我知道只使用IEnumerable而不是IEnumerable&lt;&gt;会在这里完成这项工作,但我明确需要使用通用IEnumerable&lt;&gt;因为稍后,我想进一步反思并过滤掉所有转换为泛型类型的方法。
谢谢!
答案 0 :(得分:4)
public static bool Compare(Type genericType, Type t)
{
return t.IsGenericType && t.GetGenericTypeDefinition() == genericType;
}