Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 如何将引用编译成F中新类型的公共静态方法#_F#_F# 3.0 - Fatal编程技术网

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#编译器将为您编译该类型


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

谢谢你的提示。所以我现在正在寻找一种方法来创建擦除类型。