比较泛型:"主类型"IEnumerable<>它是泛型的,但匹配所有特定类型(<int>IEnumerable,IEnumerable<object>,...)?



我想比较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;
}

相关内容

  • 没有找到相关文章

最新更新