F# 如何列出具有自定义属性的函数?
F# how to list functions with custom attribute?
我正在尝试创建某种接口,但我找不到如何在 F# 中使用自定义属性,因为 MSDN 仅显示了 CLR 属性的用法。这就是我想要实现的目标:
open System
type Command (name : string) =
inherit Attribute()
member this.Name = name
[<Command("something")>]
let doSomething () =
Console.Write("I'm doing something")
[<Command("somethingElse")>]
let doSomethingElse () =
Console.Write("I'm doing something else")
[<EntryPoint>]
let main args =
let command = Console.ReadLine()
// find function where Command.Name = command and call it
Console.Read()
0
好的,找到了。
Reflection.Assembly.GetExecutingAssembly().GetType("Program").GetMethods()
Program
typename 在代码中不可行,因此不能在 typeof<Program>
中使用,但此类型存在并且可以从程序集中获取。
要扩展您的 ,一种更通用的方法是获取所有类型,然后过滤具有您正在寻找的属性的函数(因为一旦您的应用程序,您的方法就会崩溃增长,不再将所有内容 "packed" 纳入计划 class):
let getCommands () =
let types = Assembly.GetExecutingAssembly().GetTypes()
let commands =
types
|> Array.collect (fun typ -> typ.GetMethods())
|> Array.choose (fun mi ->
mi.CustomAttributes
|> Seq.tryFind (fun attr -> attr.AttributeType = typeof<Command>)
|> Option.map (fun attr -> attr, mi))
let commandsMap =
commands
|> Seq.map (fun (attr, mi) ->
let name =
let arg = attr.ConstructorArguments.[0]
unbox<string> arg.Value
name, mi)
|> Map.ofSeq
commandsMap
这会从正在执行的程序集中获取所有类型的所有函数,然后过滤掉所有没有命令属性的函数。然后它构建一个映射,其中键是属性参数,值是函数的MethodInfo
。
我正在尝试创建某种接口,但我找不到如何在 F# 中使用自定义属性,因为 MSDN 仅显示了 CLR 属性的用法。这就是我想要实现的目标:
open System
type Command (name : string) =
inherit Attribute()
member this.Name = name
[<Command("something")>]
let doSomething () =
Console.Write("I'm doing something")
[<Command("somethingElse")>]
let doSomethingElse () =
Console.Write("I'm doing something else")
[<EntryPoint>]
let main args =
let command = Console.ReadLine()
// find function where Command.Name = command and call it
Console.Read()
0
好的,找到了。
Reflection.Assembly.GetExecutingAssembly().GetType("Program").GetMethods()
Program
typename 在代码中不可行,因此不能在 typeof<Program>
中使用,但此类型存在并且可以从程序集中获取。
要扩展您的
let getCommands () =
let types = Assembly.GetExecutingAssembly().GetTypes()
let commands =
types
|> Array.collect (fun typ -> typ.GetMethods())
|> Array.choose (fun mi ->
mi.CustomAttributes
|> Seq.tryFind (fun attr -> attr.AttributeType = typeof<Command>)
|> Option.map (fun attr -> attr, mi))
let commandsMap =
commands
|> Seq.map (fun (attr, mi) ->
let name =
let arg = attr.ConstructorArguments.[0]
unbox<string> arg.Value
name, mi)
|> Map.ofSeq
commandsMap
这会从正在执行的程序集中获取所有类型的所有函数,然后过滤掉所有没有命令属性的函数。然后它构建一个映射,其中键是属性参数,值是函数的MethodInfo
。