F# 如何获取GenericInstanceType的方法? 开放系统 open System.Runtime.CompilerServices 打开Mono.Cecil 打开Mono.Cecil.Rocks 螺旋型= |IntT |斯特林特 |类型列表的元组 让模块=ModuleDefinition.CreateModule(“TypeTokenFactory”,ModuleKind.Console) 设r1=模块导入引用(typeof) 设r2=模块导入引用(typeof) let table=ConditionalWeakTable() 表.添加(r1,IntT) 表.添加(r2,StringT) 让mscorlib_path=@“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscorlib.dll” 让mscorlib=AssemblyDefinition.ReadAssembly(mscorlib\u路径) 让我们输入字典= mscorlib.Modules[0]。类型 |>Seq.find(乐趣x->x.Name=“Dictionary`2”) 让dict_ins=dictionary_type.MakeGenericInstanceType([| r1;r2 |]) //缺少方法字段。。。

F# 如何获取GenericInstanceType的方法? 开放系统 open System.Runtime.CompilerServices 打开Mono.Cecil 打开Mono.Cecil.Rocks 螺旋型= |IntT |斯特林特 |类型列表的元组 让模块=ModuleDefinition.CreateModule(“TypeTokenFactory”,ModuleKind.Console) 设r1=模块导入引用(typeof) 设r2=模块导入引用(typeof) let table=ConditionalWeakTable() 表.添加(r1,IntT) 表.添加(r2,StringT) 让mscorlib_path=@“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscorlib.dll” 让mscorlib=AssemblyDefinition.ReadAssembly(mscorlib\u路径) 让我们输入字典= mscorlib.Modules[0]。类型 |>Seq.find(乐趣x->x.Name=“Dictionary`2”) 让dict_ins=dictionary_type.MakeGenericInstanceType([| r1;r2 |]) //缺少方法字段。。。,f#,mono.cecil,F#,Mono.cecil,我一直在试图弄清楚如何使用System.Type实现上述功能,但现在我正在尝试使用Mono.Cecil。要了解我正在尝试做的事情的一些历史,请看一下我最后一次在这里的演讲,以及我在F#repo上的开场白,这篇文章深入探讨了这一点 让我在这里简单总结一下:为了与我正在制作的语言集成,我需要能够查询.NET程序集的类型,并为类和方法替换泛型参数 现在,我不需要精确的类型来替换。正如上面的示例所示,将元数据附加到虚拟类型对于我来说已经足够了,但是现在我的问题在于,与System.type不同,一旦替换

我一直在试图弄清楚如何使用
System.Type
实现上述功能,但现在我正在尝试使用
Mono.Cecil
。要了解我正在尝试做的事情的一些历史,请看一下我最后一次在这里的演讲,以及我在F#repo上的开场白,这篇文章深入探讨了这一点

让我在这里简单总结一下:为了与我正在制作的语言集成,我需要能够查询.NET程序集的类型,并为类和方法替换泛型参数

现在,我不需要精确的类型来替换。正如上面的示例所示,将元数据附加到虚拟类型对于我来说已经足够了,但是现在我的问题在于,与
System.type
不同,一旦替换了泛型参数,我就无法再查询该类型上的方法


如此接近。有什么方法可以让Mono.Cecil实现这一点吗?或者,我希望知道是否有可能与其他图书馆合作。我根本不需要Cecil的汇编编辑功能。

Cecil为您提供了相对较低级别的元数据视图

Cecil将为您提供在程序集中表示不同元数据构造的方法,但不提供类型的运行时表示

为了回答您的问题,它不会告诉您实例化泛型类型的方法,因为这是一个运行时构造,而不是元数据中可用的内容


更高级别的API,如System.Reflection或IKVM.Reflection可以做到这一点。

我认为他实际上并不想要“实例化泛型类型的方法”,实际上我觉得他只是想要一个方法列表和仍然带有泛型参数的类型-基本上是类型的元视图(这样他可以在以后生成代码时用它的内部句柄替换这些句柄).但是这个用例应该可以与Cecil一起使用,对吗?这是真的,尽管因为Cecil在运行时没有实例化任何东西,我认为从我的问题的上下文中可以清楚地看到很多东西。描述这些东西有点让人困惑,因为在术语级别上有各种各样的类型,并且混合在一起@正确,如果您有一个
泛型实例
,那么它的
ElementType
属性将告诉您构造实例所依据的类型引用。对其调用
Resolve()
,以获取其
类型定义
,您可以浏览这些方法。只有它们不在泛型实例的上下文中。
open System
open System.Runtime.CompilerServices
open Mono.Cecil
open Mono.Cecil.Rocks

type SpiralType =
    | IntT
    | StringT
    | TupleT of SpiralType list

let module_ = ModuleDefinition.CreateModule("TypeTokenFactory",ModuleKind.Console)
let r1 = module_.ImportReference(typeof<obj>)
let r2 = module_.ImportReference(typeof<obj>)

let table = ConditionalWeakTable()
table.Add(r1,IntT)
table.Add(r2,StringT)

let mscorlib_path = @"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscorlib.dll"
let mscorlib = AssemblyDefinition.ReadAssembly(mscorlib_path)

let dictionary_type =
    mscorlib.Modules.[0].Types
    |> Seq.find (fun x -> x.Name = "Dictionary`2")

let dict_ins = dictionary_type.MakeGenericInstanceType([|r1;r2|])
// Lacks the Methods field...