F# - 获取模块

时间:2018-06-12 12:37:25

标签: f#

我有这样的模块

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#的新人。 请帮忙

1 个答案:

答案 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类型。