从ProvideMethod访问实例

时间:2014-01-12 20:21:41

标签: f# type-providers

如何从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) @@>

1 个答案:

答案 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) @@> )