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

是否可以通过反射传递F#函数?,f#,F#,是否可以通过反射传递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 =

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

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

如果这是我认为您想要的,那么它可以正常工作

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

问题是
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
设d=
typeof.GetMethod(“bar”).CreateDelegate(typeof)
:?>System.Func
函数使用foobar d.调用1000

我不明白您的第二个代码示例是如何连接到第一个的-seqIntAsc是什么?噢-谢谢您指出这一点。更正为“bar”。第二个代码示例调用Foo类型的“bar”成员,这不是我想要做的。我怀疑像部分函数一样传递函数是不可能的,因为反射。实际的问题是什么?您是否遇到编译器错误或运行时错误?我想将函数Foo.bar传递给“functionUsingFoobar”,以便在functionUsingFoobar中执行。但是,我想通过反射来选择Foo.bar(这样我就可以使用反射来选择与Foo.bar具有相同签名的任何其他函数并传递它)。我研究过试图使用InvokeMember以某种方式将args参数欺骗为null或空数组以创建部分函数,但“null”不会生成,空数组在运行时失败(如果我没记错的话)。所以我的结论是,不能使用InvokeMember通过反射来传递部分函数。不,“invokes”,即执行,Foo.bar。我想将函数Foo.bar传递给函数“functionUsingFoobar”,以便在functionUsingFoobar中执行。但是,我想通过反射来选择Foo.bar(这样我就可以使用反射来选择与Foo.bar具有相同签名的任何其他函数并传递它)。