如何获取模块中定义的方法?

时间:2014-09-24 14:17:29

标签: f#-interactive fsi

我试图从Fsi中使用F#程序集,但似乎无法找到一种方法来获取模块中定义的方法列表,以便我可以调用它们。

这是我尝试使用的示例文件。在"exposing methods that are cross language friendly"之后,我在文件顶部添加了一个命名空间,并添加了一个模块来包含之前存在的let绑定方法。如果可能的话,我想避免将所有内容都移到静态类中。

我可以使用反射,或者以另一种方式编写模块,以帮助我找到可用的方法和方法的正确套管吗?

1 个答案:

答案 0 :(得分:2)

如果我正确理解了这个问题,我会按照以下步骤进行:

1)获得所需的组件。例如,当前正在执行的程序集可以通过

获得
System.Reflection.Assembly.GetExecutingAssembly

2)然后我将通过调用GetTypes来获取在获得的程序集中定义的所有类型。如果你想过滤掉模块,你可以编写类似的东西。

let modules = Array.filter (fun x -> FSharpType.IsModule x) (assembly.GetTypes())

可以找到FSharpType课程的文档here。它包含在Microsoft.FSharp.Reflection命名空间中。

3)之后,您可以通过在单个模块上调用GetMethods方法来获取模块中的方法。例如,要打印它们,您可以编写如下内容:

let methods = [| for t in modules do for m in t.GetMethods() -> m |]
for m in methods do
    printfn "%A" m

methods是一个包含MethodInfo元素的数组。 GetMethods采用类型为BindingFlags的可选参数,可以过滤掉某些方法。看看documentation

您还可以通过调用Invoke对象上的MethodInfo方法来调用操作。

希望这很有用。