我正在尝试从 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 类型的可选参数,该参数可以筛选出某些方法。查看文档。
还可以通过在MethodInfo
对象上调用 Invoke
方法来调用操作。
希望这是有用的。