2010-07-28 15 views
9

Estoy jugando con las citas y no puedo ver un patrón de expresión para las definiciones de tipo. ¿Realmente no hay uno, o me estoy perdiendo algo?F #: ¿Cita con definición de tipo?

<@@ type MyType (name:string) = 
    member x.Name = name @@> 

Da "Unexpected keyword 'type' in quotation literal."

Respuesta

10

No puede. Solo puede citar el código, es decir, cualquier valid F# expression. Las definiciones de tipos no se consideran como código, sino como definiciones.

Lo que es posible que desee hacer es poner ReflectedDefinition atributo en un miembros de tipo:

type MyType (name : string) = 
    [<ReflectedDefinition>] member x.Name = name 

Si desea recuperar el AST de miembros que tiene ReflectedDefinition puede utilizar Expr.TryGetReflectedDefinition función.

por ejemplo, este código de ejemplo imprime AST de todos los miembros de definición reflejadas de MyType:

open Microsoft.FSharp.Quotations 
open System.Reflection 

type MyType (name : string) = 
    [<ReflectedDefinition>] member x.Name = name 

let mis = typeof<MyType>.GetMembers() 
for mi in mis do 
    try 
     match Expr.TryGetReflectedDefinition(mi :?> MethodBase) with 
     | Some(e) -> printfn "%A" e 
     | None ->() 
    with _ ->() 
()