如何从a 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) @@>
答案 0 :(得分: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) @@> )