Я думаю, что единственный способ сделать это - объявить тип внутри модуля, а затем использовать отражение, чтобы получить 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()|]
EDIT (в ответ на комментарий 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
в модуле.