2010-07-28 14 views
9

Sto giocando con le citazioni e non riesco a vedere un modello di espressione per le definizioni di tipo. Non ce n'è davvero uno o mi sto perdendo qualcosa?F #: offerta con definizione del tipo?

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

Assegna "Parola chiave imprevista" tipo "in quotazione letterale".

risposta

10

Non è possibile. Puoi solo citare il codice, vale a dire qualsiasi valid F# expression. Le definizioni di tipo non sono considerate come codice, ma definizioni.

Cosa si potrebbe desiderare di fare è mettere ReflectedDefinition attributo su un soci Type:

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

Se si desidera recuperare l'AST di membri che hanno ReflectedDefinition è possibile utilizzare la funzione Expr.TryGetReflectedDefinition.

per esempio, questo codice di esempio quadri AST di tutti i membri definizione riflesse 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 _ ->() 
()