F# 调用模块中的函数

F# Invoke Function in Module

我正在尝试为我的应用程序编写一个安装程序,该应用程序(主要)运行大量数据库迁移。

我这里的开始非常简单,我只是想弄清楚 invokeMethod 应该等于什么。

let RunMigration (fsModule: System.Type) =
    fsModule.GetProperties()
        |> Array.filter (fun property -> property.Name = "run")
        |> Array.map(fun property -> property |> invokeMethod ; "Ran successfully")
        |> String.concat "<br/>"

let RunAllMigrations =
    Assembly
        .GetExecutingAssembly()
        .GetTypes()
        |> Array.filter FSharpType.IsModule
        |> Array.filter (fun fsModule -> fsModule.Namespace = "DredgePos.Migrations")
        |> Array.map RunMigration
        |> String.concat "<br/><hr/>"

目前如您所见,这是一个相当简单的过程

  1. 获取程序集中的所有类型
  2. 正在获取 Migrations 命名空间中的所有模块。
  3. 然后如果该模块有一个名为 run 的函数,我想调用它。

如何调用它?

编辑:

run 方法将始终为 Unit -> Unit

let run () = ()

在您的 RunMigration 方法中,您将获得该类型的属性列表 - 但在您的示例中声明的函数应编译为方法。例如,如果我在当前程序集中有以下模块:

module XX = 
  let run () = printfn "hello!"

如果 RunMigration 函数首先找到 run 方法然后调用不带参数的 Invoke 操作(并且 null 作为实例,因为这是一个静态方法):

let RunMigration (fsModule: System.Type) =
  let mi = fsModule.GetMethod("run")
  mi.Invoke(null,[||]) |> ignore

此 returns obj 值,将是 null(作为方法 returns unit),因此您通常可以忽略结果。