2016-05-05 6 views
8

में उदाहरण को संदर्भित करने के लिए सही तरीके से कॉल करने का तरीका मैं एक जनरेटिव प्रकार प्रदाता में ProvidedConstructor के InvokeCode पर कोड को सही तरीके से कैसे आपूर्ति करूं जो निम्नलिखित के बराबर होगा?प्रोविडड कॉन्स्ट्रास्ट्रक्टर

को देखते हुए:

type NewGeneratedType() as self = 
    inherit BaseType() 

    do 
     Utils.someFun "Foo" (box self) 

मैं आधार निर्माता काम कर रहे करने के लिए कॉल किया है, लेकिन पता नहीं कैसे ठीक से काट रहे हैं:

module Utils = 
    let someFun (s : string) (inst : obj) = 
      // Does something here... 
     () 

मैं प्रभावी ढंग उत्पन्न प्रकार की आवश्यकता है उदाहरण और फ़ंक्शन को कॉल करें:

let ctor = ProvidedConstructor([]) 
let ci = baseType.GetConstructor(BindingFlags.Public ||| BindingFlags.Instance, null, [| |], null) 
ctor.BaseConstructorCall <- fun args -> ci, args 

// I do not know how to properly call this to match the constructor above 
ctor.InvokeCode <- fun args -> <@@() @@> 

उत्तर

2

मैं यह मिल गया के माध्यम से काम कर रहे:

ctor.InvokeCode <- 
    fun args -> 
     let this = Seq.head args 
     let boxed = Expr.Coerce(this, typeof<obj>) 
     <@@ Utils.someFun "Foo" %%(boxed) @@> 

ध्यान दें कि जोड़ में पहले दो लाइनों को स्थानांतरित करने की कोशिश कर त्रुटियों के सभी प्रकार के कारण होता है, लेकिन जब मैं इसे खींचता हूं, यह पूरी तरह से काम करता है।

1

@ रीड कॉपसी, मुझे लगता है कि आपको अपना ओ कॉल करने की आवश्यकता है वास्तव में wn निर्माता:

मानते हुए कि आपके NewGeneratedType एक ठोस प्रकार आप पहले से ही परिभाषित किया है

<@@ let this = (ctor.Invoke([||])) :> NewGeneratedType 
    Utils.someFun "foo" (box this) 
@@> 

NewGeneratedType परिभाषित नहीं है, लेकिन है यह भी एक प्रदान की प्रकार ही है, यदि आप एक Expr.Coerce की आवश्यकता होगी है:

<@@ let this = (ctor.Invoke([||])) 
    let thisTyped = %%Expr.Coerce(this, providedType) 
    Utils.someFun "foo" (box this) 
@@> 

मुझे यह फ़ंक्शन 100% सुनिश्चित नहीं है लेकिन मुझे आशा है कि यह आपको रास्ते में लाएगा।

+0

दुर्भाग्यवश, 'ctor.Invoke' त्रुटियों को रिपोर्ट करता है' ... एक त्रुटि की सूचना दी: अज्ञात निरंतर 'प्रदाता कार्यान्वयन। संरक्षित प्रकार। संरक्षित नियंत्रक' जेनरेट विधि में –

3

यह एक "this" argument is passed in as the last argument to the ctor

आपकी InvokeCode समारोह will get run और लौट आए उद्धरण अनुवाद से की तरह दिखता है। तो, मुझे लगता है कि आप सभी की जरूरत है कुछ की तरह:

ctor.InvokeCode <- fun args -> <@@ let me = Seq.last args @@> 
+1

'यह हमेशा पहले होता है। 'xs |> List.append x'' list.append x xs' के बराबर है और 'x :: xs' –

+0

पर equeal है ध्यान दें कि इसका उपयोग करने का प्रयास हमेशा एक प्रकार की मेलबैक त्रुटि देता है: उद्धरण में अभिव्यक्ति को विभाजित करते समय मेल नहीं खाएं शाब्दिक। अभिव्यक्ति वृक्ष डालने का प्रकार splicing ऑपरेशन द्वारा अपेक्षित प्रकार से मेल नहीं खाता है। अपेक्षित 'न्यू जेनरेटेड टाइप', लेकिन प्राप्त 'System.Object' टाइप किया गया। अपेक्षित अभिव्यक्ति प्रकार के साथ टाइप-एनोटेटिंग पर विचार करें ... 'मुझे कुछ भी नहीं लगता है कि मुझे इस पर काम करने की अनुमति मिलती है। –

+0

बीटीडब्ल्यू - इससे मुझे वहां लाने में मदद मिली - http://stackoverflow.com/a/37172942/65358 पर धन्यवाद क्या था धन्यवाद @CAIndy –