Как скомпилировать цитату в публичный статический метод нового типа в F # - PullRequest
3 голосов
/ 23 сентября 2011

Я играю с поставщиками типов и пытаюсь скомпилировать цитату в открытый статический метод нового сгенерированного типа. Вот что у меня есть:

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 (), но я думаю, что это не то, что мне нужно. Есть идеи?

1 Ответ

4 голосов
/ 23 сентября 2011

Я еще не играл с релизом F # 3.0, но я думаю, что вам не нужно самостоятельно генерировать код IL.В публикации Кейта объясняется, что существует два типа провайдеров типов - сгенерированные , которые создают реальный тип .NET (который существует в некоторой библиотеке), и стертые , которыесоздайте поддельный тип, а затем дайте компилятору дерево выражений, которое будет использоваться вместо вызовов поддельного типа.

Мне кажется, что вы пытаетесь реализовать генерируемый типпровайдер в ситуации, когда стерт тип будет более уместным.В стертом случае вы сможете просто вернуть тип .NET Expression<..> (не цитату F #, но вы можете использовать ToLinqExpression из PowerPack), и компилятор F # скомпилирует это для вас.

Однако я еще не играл с ним, поэтому я не знаю, какой именно механизм.

...