我试图从Fsi中使用F#程序集,但似乎无法找到一种方法来获取模块中定义的方法列表,以便我可以调用它们。
这是我尝试使用的示例文件。在"exposing methods that are cross language friendly"之后,我在文件顶部添加了一个命名空间,并添加了一个模块来包含之前存在的let绑定方法。如果可能的话,我想避免将所有内容都移到静态类中。
我可以使用反射,或者以另一种方式编写模块,以帮助我找到可用的方法和方法的正确套管吗?
答案 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
方法来调用操作。
希望这很有用。