экземпляр передается в качестве первого выражения в 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) @@>)