【发布时间】:2017-08-13 03:30:51
【问题描述】:
是否可以采用 FSharp 函数并将其转换为 Dynamic 函数,或者将来 FSharp 是否会出现类似的功能?
let func (a:int) (b:int) : int =
a + b
let dynamicFunc = FSharpFunc.ToDynamicFunc(func)
let argumentList = [1; 2]
let object = dynamicFunc argumentList
let result = object :?> int
看来您目前必须回退到标准反射(例如:calling a F# function by name)但是,这种方法似乎非常脆弱。主要是因为没有真正的保证它会起作用,而且你必须知道幕后发生了什么。
这样的东西可以用来包装任何函数并动态地做事。
let wrapFun (x:'f) : 'f =
let args = FSharp.Reflection.FSharpType.GetFunctionElements <| x.GetType()
let runner (any:obj list) : obj =
// Do extra things
FSharpFunc.DynamicInvoke x
FSharp.Reflection.FSharpValue.MakeFunction (typeof<'f>, runner) :?> 'f
【问题讨论】:
-
你能给出一个更真实的用例吗?有多种方法可以动态地做事,但如果可能的话,我通常会避免使用它们,因为它们只会更容易引入错误。在您的特定示例中,您有一个具有静态已知类型的函数
func,因此动态调用它似乎没有帮助。 -
在这种情况下,我在考虑远程调用,因此调用包装函数会收集参数并将它们发送到远程机器,在那里它会实际调用该函数。