2014-01-12 2 views
0

Как получить доступ к (во время выполнения) экземпляр из реализации в ProvidedMethodДоступ к экземпляру из ProvidedMethod

, то есть если foo имеет для указанного типа и стертый тип Bar с помощью метода под названием Execute Затем дал этот код

foo.Execute() 

Я желаю ProvidedMethod равным этой

bar.Execute() //where bar is an object of type Bar 

Что у меня есть это

//p is a MethodInfo that represents Bar.Execute and m is the ProvidedMethod 
objm.InvokeCode <- fun args -> <@@ p.Invoke(--what goes here--,null) @@> 

ответ

4

экземпляр передается в качестве первого выражения в args массиве, так что вы можете получить доступ к нему оттуда.

Кроме того, InvokeCode, который вам нужно построить, не должен записывать информацию об объекте p и называть Invoke на нем с использованием отражения. Вместо этого вам нужно построить цитату F # (сродни дереву выражений), которую представляет вызов.

Таким образом, вы должны написать что-то вроде этого:

objm.InvokeCode <- (fun args -> 
    // The 'args' parameter represents expressions that give us access to the 
    // instance on which the method is invoked and other parameters (if there are more) 
    let instance = args.[0] 
    // Now we can return quotation representing a call to MethodInfo 'p' with 'instance' 
    Expr.Call(instance, p)) 

Обратите внимание, что я не использовал <@@ .. @@> здесь, потому что у вас уже есть MethodInfo для метода, который вы хотите позвонить. Если вы вместо этого хотите позвонить по методу ProviderRuntime.DoStuff(instance), то вы можете использовать литературные цитаты:

objm.InvokeCode <- (fun args -> 
    let instance = args.[0] 
    <@@ ProviderRuntime.DoStuff(%%instance) @@>) 
Смежные вопросы