gpt4 book ai didi

f# - 如何在 F# 中将引用编译为新类型的公共(public)静态方法

转载 作者:行者123 更新时间:2023-12-05 01:24:00 25 4
gpt4 key购买 nike

我正在使用类型提供程序,我正在尝试将引用编译为新生成类型的公共(public)静态方法。这是我所拥有的:

let CreateType<'i> name methodName quotation =
let assemblyName = new AssemblyName(Name = "tmpAssembly")
let assemblyBuilder =
System.AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave)

let filename = "tmpAssembly.dll"
let tmpModule = assemblyBuilder.DefineDynamicModule(filename,filename)

// create a new type builder
let typeBuilder =
tmpModule.DefineType(
name,
TypeAttributes.Public ||| TypeAttributes.Class,
null, // parentType
[|typeof<'i>|])

let attr = MethodAttributes.Public ||| MethodAttributes.HideBySig ||| MethodAttributes.Static

let methodImpl =
typeBuilder.DefineMethod(
methodName,
attr,
typeof<unit>, // todo
[||]) // todo

let il = methodImpl.GetILGenerator()

// compile quotation to method

typeBuilder.CreateType()

我知道有一个 .Compile() 方法,但我认为这不是我需要的。有什么想法吗?

最佳答案

我还没有真正使用过 F# 3.0 版本,但我认为您不需要自己生成 IL 代码。 post by Keith解释说有两种类型的类型提供程序 - generated 创建真实的 .NET 类型(存在于某些库中)和 erased 创建假类型然后提供编译一个表达式树,用于代替对假类型的调用。

在我看来,您正在尝试在 erased 类型更合适的情况下实现 generated 类型提供程序。在删除的情况下,您应该能够返回 .NET Expression<..>键入(虽然不是 F# 引号,但您可以使用 PowerPack 中的 ToLinqExpression),F# 编译器将为您编译它。

但是,我还没有玩过,所以我不知道确切的机制是什么。

关于f# - 如何在 F# 中将引用编译为新类型的公共(public)静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7527766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com