2016-05-05 7 views
8

'daki örneğe işaret eden doğru yöntem çağrısı Kod, ProvidedConstructor ürününün InvokeCode ürününe aşağıdaki gibi eşdeğer bir yazım sağlayıcısına düzgün şekilde nasıl sağlayabilirim?ProvidedConstructor

Verilen:

type NewGeneratedType() as self = 
    inherit BaseType() 

    do 
     Utils.someFun "Foo" (box self) 

Ben temel kurucu çalışma çağrısı var, ama düzgün dilimlemeniz nasıl bilmiyorum:

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

ben etkili yapmak oluşturulan türü olması gerekir örneği ve aşağıdaki işlevi çağırın:

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 -> <@@() @@> 

cevap

2

: Yani, ben bir şey gibi tek ihtiyacınız olduğunu düşünüyorum ek yeri ilk iki satırını taşımaya çalışıyor hataları her türlü neden olduğunu

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

Not ama onu çıkardığımda mükemmel çalışıyor.

1

@Reed Copsey, O'nu aramanız gerektiğini düşünüyorum. aslında wn yapıcısı:

Eğer NewGeneratedType varsayarak aynı zamanda bir sağlanan tip kendisi, bir Expr.Coerce gerekir NewGeneratedType tanımlı değilse zaten

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

tanımlanmış ama gelmiş somut bir türüdür:

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

Bu işlevin% 100 emin olmadığına inanıyorum ama umarım bu sizi yoldan çıkaracaktır.

+0

Ne yazık ki, 'ctor.Invoke' eklediğinde erorr 'bildiriliyor ... bir hata bildirdi: bilinmeyen sabit 'ProviderImplementation.ProvidedTypes.ProvidedConstructor' oluşturulan yöntemde ' –

3

orada senin InvokeCode fonksiyonu will get run ve tercüme döndü alıntıda verilen bir "this" argument is passed in as the last argument to the ctor

benziyor. Ben aracılığıyla çalışan bu var

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

' this 'her zaman ilktir. xs |> List.append x', 'List.append x xs' değerine eşittir ve 'x :: xs' –

+0

'a eşittir. Bunu kullanmaya çalışmanın her zaman bir tür uyuşmazlığı hatası verdiğini unutmayın: * İfadeyi ifade içine eklerken türü eşleşmiyor değişmezi. Eklenen ifade ağacının türü, ekleme işlemi tarafından beklenen türle eşleşmiyor. 'NewGeneratedType' bekleniyor, ancak 'System.Object' türü alındı. Beklenen ifade türüyle tip-açıklama yazmayı düşünün, '' Denediğim hiçbir şey bu konuda çalışmamı sağlıyor. –

+0

BTW - Beni buraya getirdi - http://stackoverflow.com/a/37172942/65358 adresinden neyin gerekli olduğunu iletildi Teşekkürler @CAIndy –