1

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

我不知道如何通过反射传递函数

4

2 回答 2

2

问题是GetMethod返回 a 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
于 2012-06-17T17:00:48.290 回答
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|])
于 2012-06-17T07:35:15.957 回答