2011-09-23 2 views
3

형식 공급자와 함께 놀고 있으며 생성 된 새 형식의 public static 메서드에 인용을 컴파일하려고합니다. 여기에 내가 무엇을 가지고 :F에서 새 형식의 public static 메서드로 인용을 컴파일하는 방법

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() 메소드가 알고하지만 난 그게 내가 필요하지 생각합니다. 어떤 아이디어?

답변

4

아직 F # 3.0 릴리스로 연주하지는 않았지만 직접 IL 코드를 생성 할 필요가 없다고 생각합니다. post by Keith에는 유형의 실제 .NET 유형 (일부 라이브러리에 있음)을 생성하는과 가짜 유형을 생성하는이 삭제 된 의 두 가지 유형이 있음을 설명하고 컴파일러에 사용할 표현식 트리를 제공합니다. 가짜 유형에 대한 호출 위치.

당신이 삭제 유형이 더 적합 할 것입니다 상황에서 유형 제공자를 생성 구현하기 위해 노력하고 나에게 보인다. 지워진 경우 .NET Expression<..> 형식을 반환 할 수 있어야합니다 (F # 인용 부호가 아니지만 PowerPack의 ToLinqExpression을 사용할 수 있음). F # 컴파일러가이를 컴파일합니다.

그러나 나는 아직 그걸 가지고 놀지 않았기 때문에 정확한 메커니즘이 무엇인지 알지 못합니다.

+0

힌트를 보내 주셔서 감사합니다. 그래서 지워진 타입을 만드는 방법을 찾고 있습니다. – forki23

관련 문제