我正在尝试使用来自 Fsi 的 F# 程序集,但似乎无法找到一种方法来获取模块中定义的方法列表,以便我可以调用它们。
这是我正在尝试使用的示例文件。在遵循“跨语言友好的公开方法”之后,我在文件顶部添加了一个命名空间,并添加了一个模块来包含之前存在的 let 绑定方法。如果可能的话,我想避免将所有东西都移到静态类中。
我可以使用反射,或者以另一种方式编写模块来帮助我找到可用的方法和方法的正确封装吗?
我正在尝试使用来自 Fsi 的 F# 程序集,但似乎无法找到一种方法来获取模块中定义的方法列表,以便我可以调用它们。
这是我正在尝试使用的示例文件。在遵循“跨语言友好的公开方法”之后,我在文件顶部添加了一个命名空间,并添加了一个模块来包含之前存在的 let 绑定方法。如果可能的话,我想避免将所有东西都移到静态类中。
我可以使用反射,或者以另一种方式编写模块来帮助我找到可用的方法和方法的正确封装吗?
如果我正确理解了这个问题,我将按照以下步骤进行:
1)获取所需的程序集。例如,当前正在执行的程序集可以通过
System.Reflection.Assembly.GetExecutingAssembly
2)然后我将通过调用获取获得的程序集中定义的所有类型GetTypes
。如果你想过滤掉模块,你可以写类似的东西。
let modules = Array.filter (fun x -> FSharpType.IsModule x) (assembly.GetTypes())
FSharpType
可以在此处找到该类的文档。它包含在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类型的可选参数,可以过滤掉一些方法。看看文档。
您还可以通过调用对象的Invoke
方法来调用操作MethodInfo
。
希望这很有用。