比较泛型:A&#34;主类型&#34; IEnumerable的&LT;&GT;这是通用的,但匹配所有特定类型(IEnumerable <int>,IEnumerable <object>,...)?</object> </int>

时间:2014-06-02 11:25:27

标签: c# generics reflection

我想将typeof(IEnumerable&lt;&gt;)与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;因为稍后,我想进一步反思并过滤掉所有转换为泛型类型的方法。

谢谢!

1 个答案:

答案 0 :(得分:4)

public static bool Compare(Type genericType, Type t)
{
    return t.IsGenericType && t.GetGenericTypeDefinition() == genericType;
}