10

我在玩引号,我看不到类型定义的表达式模式。真的没有,还是我错过了什么?

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

给出“引号文字中的意外关键字'类型'。”

4

1 回答 1

11

你不能。您只能引用代码,即任何有效的 F# 表达式。类型定义不被视为代码,而是定义。

您可能想要做的是将ReflectedDefinition属性放在类型成员上:

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

如果您想检索具有ReflectedDefinition您可以使用Expr.TryGetReflectedDefinition功能的成员的 AST。

例如,此示例代码打印 的所有反射定义成员的 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 _ -> ()
()
于 2010-07-28T16:25:54.360 回答