c# - 使用构造的泛型类型中的 'ConstructorInfo',如何从开放类型中获取匹配的 'ConstructorInfo'?

标签 c# .net generics reflection

在 .NET 中,我有一个 ConstructorInfo 实例。声明类型是构造泛型类型(也称为 foo.DeclaringType.IsConstructedGenericType == true)。我想检索属于开放类型的 ConstructorInfo 实例 - 即声明类型的泛型类型定义。

使用foo.DeclaringType.GetGenericTypeDefinition() 获取开放类型本身很简单;然而,目前还没有明显的方法来获得匹配的构造函数。我可以重新枚举两边的所有构造函数,但是,我仍然面临着将这两个列表匹配在一起的问题;而且我不确定 .NET 是否提供任何保证以相同顺序枚举构造函数。

有没有人有办法获得原始的 ConstructorInfo 副本?

最佳答案

我认为您可以使用 MetadataToken 属性匹配构造函数:

 var closed = foo.GetType().GetConstructors().Select(c => c.MetadataToken);
 var open = foo.GetType().GetGenericTypeDefinition().GetConstructors().Select(o => o.MetadataToken);
 var b = Enumerable.SequenceEqual(closed, open); //returns true

构造函数的封闭版本和开放版本似乎具有相同的元数据标记,因此这将是连接两个列表的一种方式。即使泛型类和封闭类型是在不同的程序集中定义的,这也是成立的。

我还没有找到任何证据证明这是记录在案的行为,但您应该能够在 ECMA C# and Common Language Infrastructure Standards 中进一步调查或 Standard ECMA-335 - Common Language Infrastructure (CLI)

关于c# - 使用构造的泛型类型中的 'ConstructorInfo',如何从开放类型中获取匹配的 'ConstructorInfo'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43850948/

相关文章:

c++ - 通用变量 C++

Java 泛型,检测超出范围的字节

c# - 适当使用静态方法

c# - 从 WinForms WebBrowser 控件获取页面高度

c# - 使用 C# 和 FiddlerCore 收听特定应用程序

.net - 将 Excel 2007 数据保存到新的 PowerPoint 演示文稿

c# - 如何在 NHibernate 中克隆对象?

.net - Vista 上的 MSI 错误代码 2869

generics - 如何规避 Kotlin 的限制 "Type parameter is forbidden for catch parameter"

c# - 从特定行号(例如 2 到 50)读取 CSV 文件