F# 如何将引用编译成F中新类型的公共静态方法#
我正在使用类型提供程序,并尝试将引用编译成新生成类型的公共静态方法。以下是我所拥有的:F# 如何将引用编译成F中新类型的公共静态方法#,f#,f#-3.0,F#,F# 3.0,我正在使用类型提供程序,并尝试将引用编译成新生成类型的公共静态方法。以下是我所拥有的: let CreateType<'i> name methodName quotation = let assemblyName = new AssemblyName(Name = "tmpAssembly") let assemblyBuilder = System.AppDomain.CurrentDomain.DefineDynamicAssembly(ass
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()
让CreateType |]]
设attr=MethodAttributes.Public | | | MethodAttributes.HideBySig | | | MethodAttributes.Static
设methodImpl=
typeBuilder.DefineMethod(
方法名,
attr,
typeof,//todo
[| |]//待办事项
设il=methodImpl.GetILGenerator()
//将报价编译为方法
typeBuilder.CreateType()
我知道有一个.Compile()方法,但我认为这不是我需要的。有什么想法吗?我还没有真正玩过F#3.0版本,但我认为您不需要自己生成IL代码。说明有两种类型的类型提供程序-生成的创建真实的.NET类型(存在于某些库中)和删除的创建假类型,然后为编译器提供一个表达式树以代替对假类型的调用 在我看来,您正试图在擦除类型更合适的情况下实现生成的类型提供程序。在已擦除的情况下,您应该只能够返回.NET
表达式
类型(虽然不是F#引号,但您可以使用PowerPack中的ToLinqExpression
),F#编译器将为您编译该类型
但是,我还没有玩过它,所以我不知道确切的机制是什么。谢谢你的提示。所以我现在正在寻找一种方法来创建擦除类型。