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/>"
目前如您所见,这是一个相当简单的过程
- 获取程序集中的所有类型
- 正在获取
Migrations
命名空间中的所有模块。
- 然后如果该模块有一个名为
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
),因此您通常可以忽略结果。
我正在尝试为我的应用程序编写一个安装程序,该应用程序(主要)运行大量数据库迁移。
我这里的开始非常简单,我只是想弄清楚 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/>"
目前如您所见,这是一个相当简单的过程
- 获取程序集中的所有类型
- 正在获取
Migrations
命名空间中的所有模块。 - 然后如果该模块有一个名为
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
),因此您通常可以忽略结果。