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返すMethodInfoことですが、F# 関数の値が必要です。この不一致を解決する最も簡単な方法は、メソッドから .NET デリゲートを作成し、メソッドを正しい型の関数値としてCreateDelegate扱うことです。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

If this is what I think you want, it works just fine

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 に答える