我想比较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。
对于这个问题可能不是必需的,但是一些背景:
我正在编写一个转换类,它将一个对象转换为其他类型。我使用属性(xlconverders):
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)
{
// ...
}
它使用反射来获得具有xlconvert的方法。to == toType,因此基本上它反映了它自己的类,以便在给定所需目标类型的情况下找到适当的转换方法。
现在当我调用Convert(input, typeof(IEnumerable))时,它应该通过反射找到ToIEnumerable方法。但是由于我只能用[xltransforms (to = typeof(IEnumerable<>))标记它,并且IEnumerable<>不是IEnumerable,因此它不会找到此方法。
我知道只要使用IEnumerable而不是IEnumerable<>就可以完成这里的工作,但是我明确地需要使用泛型IEnumerable<>,因为稍后,我想做进一步的反射并过滤掉所有转换为泛型类型的方法。
谢谢!
public static bool Compare(Type genericType, Type t)
{
return t.IsGenericType && t.GetGenericTypeDefinition() == genericType;
}