是否可以通过Reflection传递F#函数?
(*in module A*)
type Foo() =
static member bar n = {1..n}
let functionUsingFoobar (x:(int -> #('a seq)) n =
let z = BarFoo.ofSeq (x n)
z.count
(* in module B
here is where I want to pass Foo.bar by reflection*)
let y = functionUsingFoobar Foo.bar 1000
我不能在没有args参数的情况下调用成员,因此通过InvokeMember的部分函数应用程序无法工作。
let foo = new Foo()
let z = foo.GetType().InvokeMember("bar", System.Reflection.BindingFlags.InvokeMethod, null, foo, [|1000|])
(*tried null, [||], [|null|] for args parameter*)
我没有想法如何通过反射传递函数
答案 0 :(得分:2)
问题是GetMethod
返回MethodInfo
,但您需要一个F#函数值。克服这种不匹配的最简单方法可能是使用CreateDelegate
从该方法创建.NET委托,然后将Invoke
方法视为正确类型的函数值:
let d =
typeof<Foo>.GetMethod("bar").CreateDelegate(typeof<System.Func<int,seq<int>>>)
:?> System.Func<int,seq<int>>
functionUsingFooBar d.Invoke 1000
答案 1 :(得分:0)
如果这是我认为你想要的,那就可以了。
type Foo() =
static member bar n = {1..n}
let functionUsingFoobar (x:(int -> #('a seq))) n =
(x n) |> Seq.length
let y = functionUsingFoobar Foo.bar 1000
let foo = new Foo()
let z = fun t -> foo.GetType().InvokeMember("bar", System.Reflection.BindingFlags.InvokeMethod, null, foo, [|t|])