我有这样的模块
module CommonModule
let addFive x =
x+5
let multiFive x =
x*5
我想通过反思列出这个模块的方法。 我发现了这个:Can you list the contents of a namespace or module in F#,但我不知道如何使用它。 我是F#的新人。 请帮忙
答案 0 :(得分:3)
我认为唯一的方法是在模块中声明一个类型,然后使用反射来获取DeclaringType
并在其上调用GetMethods
:
open System.Reflection
module CommonModule =
type Marker = interface end
let f x = x * x
typeof<CommonModule.Marker>.DeclaringType.GetMethods()
这将为您提供MethodInfo []
包含f
以及从System.Object
继承的方法:
[|Int32 f(Int32); System.String ToString(); Boolean Equals(System.Object);
Int32 GetHashCode(); System.Type GetType()|]
编辑(回复 lukaszb 的评论)
如果要按名称查找模块,则需要先获取程序集,然后在程序集中找到模块类型并调用GetMethods
。要对上一个示例执行此操作,您需要添加以下代码:
// Get the assembly somehow (by name, by GetEntryAssembly, etc)
let assembly = Assembly.GetExecutingAssembly()
// Retrieve the methods (including F# functions) on the module type
let functions =
match assembly.GetTypes() |> Array.tryFind (fun t -> t.Name = "CommonModule") with
| Some moduleType -> moduleType.GetMethods()
| None -> [||]
// Find the function you want
match functions |> Array.tryFind (fun f -> f.Name = "f") with
| Some f -> f.Invoke(null, [|2|]) // Invoke the function
| None -> failwith "Function `f` not found"
这样做的一个好处是您不再需要模块中的Marker
类型。