F #: Цитата с определением типа? - PullRequest
9 голосов
/ 28 июля 2010

Я играю с цитатами и не вижу шаблон выражения для определения типа. Неужели нет ни одного, или я что-то упустил?

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

Дает "Неожиданное ключевое слово 'type' в литерале кавычки."

1 Ответ

10 голосов
/ 28 июля 2010

Вы не можете. Вы можете цитировать только код, то есть любое правильное выражение F # . Определения типов рассматриваются не как код, а как определения.

Что вы можете сделать, это поставить атрибут ReflectedDefinition для членов типа:

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

Если вы хотите получить AST членов, которые имеют ReflectedDefinition, вы можете использовать функцию 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 _ -> ()
()
...