是否可以通过Reflection传递F#函数?

时间:2012-06-17 00:22:36

标签: f#

是否可以通过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*)

我没有想法如何通过反射传递函数

2 个答案:

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