2010-07-28 15 views
9

मैं उद्धरण के साथ खेल रहा हूं और मैं टाइप परिभाषाओं के लिए अभिव्यक्ति पैटर्न नहीं देख सकता हूं। क्या वास्तव में कोई नहीं है, या क्या मुझे कुछ याद आ रहा है?एफ #: प्रकार परिभाषा के साथ कोटेशन?

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

उद्धरण शाब्दिक में "अप्रत्याशित कीवर्ड 'प्रकार' देता है।

उत्तर

10

आप नहीं कर सकते। आप केवल valid F# expression कह सकते हैं, कोड उद्धृत कर सकते हैं। टाइप परिभाषाओं को कोड के रूप में नहीं माना जाता है, लेकिन परिभाषाएं।

आप क्या करना चाहते हो सकता है क्या एक प्रकार के सदस्यों पर डाल दिया जाता है ReflectedDefinition विशेषता:

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

आपको लगता है कि है ReflectedDefinition सदस्यों की एएसटी को पुनः प्राप्त करना चाहते हैं तो आप Expr.TryGetReflectedDefinition फ़ंक्शन का उपयोग कर सकते हैं।

उदा, इस नमूना कोड प्रिंट MyType के सभी परिलक्षित परिभाषा सदस्यों की ASTs:

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 _ ->() 
() 
संबंधित मुद्दे