2010-07-28 29 views
9

Tôi đang phát xung quanh với các trích dẫn và tôi không thể thấy mẫu biểu thức cho các định nghĩa loại. Có thực sự không phải là một, hoặc tôi thiếu một cái gì đó?F #: Báo giá với định nghĩa kiểu?

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

Cung cấp "Từ khóa không mong muốn 'loại' trong ngoặc kép".

Trả lời

10

Bạn không thể. Bạn chỉ có thể trích dẫn mã, tức là, bất kỳ số valid F# expression nào. Định nghĩa kiểu không được coi là mã, nhưng định nghĩa.

Những gì bạn có thể muốn làm là đặt ReflectedDefinition thuộc tính trên một loại thành viên:

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

Nếu bạn muốn lấy AST của các thành viên có ReflectedDefinition bạn có thể sử dụng chức năng Expr.TryGetReflectedDefinition.

ví dụ, mẫu mã này in ASTs của tất cả các thành viên định nghĩa phản ánh của 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 _ ->() 
() 
Các vấn đề liên quan