引用符で遊んでいますが、型定義の式パターンがわかりません。本当に1つもありませんか、それとも何か不足していますか?
<@@ type MyType (name:string) =
member x.Name = name @@>
「引用リテラルに予期しないキーワード 'type' があります。」
引用符で遊んでいますが、型定義の式パターンがわかりません。本当に1つもありませんか、それとも何か不足していますか?
<@@ type MyType (name:string) =
member x.Name = name @@>
「引用リテラルに予期しないキーワード 'type' があります。」
できません。コード、つまり有効な F# 式のみを引用できます。型定義はコードではなく、定義と見なされます。
あなたがしたいことはReflectedDefinition
、型メンバーに属性を置くことです:
type MyType (name : string) =
[<ReflectedDefinition>] member x.Name = name
関数ReflectedDefinition
を使用できるメンバーの AST を取得する場合。Expr.TryGetReflectedDefinition
たとえば、このサンプル コードは、反映されたすべての定義メンバーの AST を出力します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 _ -> ()
()