将构造函数匹配到泛型类型定义中的对应项

时间:2014-09-01 23:21:37

标签: c# generics reflection

我一直在考虑这个问题,感觉必须有一个我想要的简单解决方案。

我们说我有以下课程:

public class Foo<T>
{
   public Foo(T value)
   {
   }

   public Foo(int value)
   {   
   }
}

如果我在类型Foo<System.Int32>上获得所有构造函数,我将返回两个构造函数,这两个构造函数都有一个类型为System.Int32的参数,无法区分。

如果我从Foo<System.Int32>Foo<T>)的泛型类型定义中获取所有构造函数,我将返回两个构造函数。一个接受通用参数T,另一个接受System.Int32

类型的参数
// Will return two constructors with signatures that look identical.    
var type = typeof(Foo<int>);    
var ctors1 = type.GetConstructors();

// Will return two constructors as well. Parameters can be differentiated.
var genericTypeDefinition = typeof(Foo<int>).GetGenericTypeDefinition();
var ctors2 = genericTypeDefinition.GetConstructors();

有没有办法将构造函数与其泛型类型定义中的对应项匹配?

1 个答案:

答案 0 :(得分:2)

在两种情况下比较ctors,您可以比较他们的MetadataToken。 例如:

foreach (var item in ctors1)
{
    var ctorMatch = ctors2.SingleOrDefault(c => c.MetadataToken == item.MetadataToken);
}