2010-07-28 6 views
9

Je joue avec des citations et je ne peux pas voir un modèle d'expression pour les définitions de type. N'y en a-t-il vraiment pas ou est-ce que je manque quelque chose?F #: Cotation avec définition de type?

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

Donne "Type de mot clé inattendu" dans le littéral de citation. "

Répondre

10

Vous ne pouvez pas. Vous ne pouvez citer que du code, c'est-à-dire valid F# expression. Les définitions de type ne sont pas considérées comme du code, mais comme des définitions.

Ce que vous pouvez faire est de mettre ReflectedDefinition attribut sur un des membres du type:

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

Si vous souhaitez récupérer l'AST des membres qui ont ReflectedDefinition vous pouvez utiliser la fonction Expr.TryGetReflectedDefinition.

, par exemple cet exemple de code imprime de tous les membres RSHS de définition réfléchis 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 _ ->() 
() 
Questions connexes