F # - Получить список методов в модуле - PullRequest
0 голосов
/ 12 июня 2018

У меня есть такой модуль

module CommonModule

    let addFive x =
        x+5

    let multiFive x =
        x*5

И я хотел бы перечислить методы этого модуля по отражению.Я нашел это: Можете ли вы перечислить содержимое пространства имен или модуля в F # , но я не знаю, как его использовать.Я новичок в F #.Пожалуйста, помогите

1 Ответ

0 голосов
/ 12 июня 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...