获取F#中的非静态成员的名称

时间:2019-03-17 16:21:29

标签: f#

在C#中,您可以使用来获取方法的名称

nameof(ISomeClass.SomeMethod)

这在F#中可行吗?尝试点入ISomeClass以获取SomeMethod时,它只说“ SomeMethod不是静态方法”

1 个答案:

答案 0 :(得分:3)

您可以基于F#报价创建一种以类型安全的方式检索接口方法的方法。

open FSharp.Quotations
open FSharp.Quotations.Patterns

let getMethodName (e: Expr<'T -> 'U>) = 
  match e with
  | Lambda (_, Call (_, mi, _)) -> mi.Name
  | _ -> failwith "%A is not a valid getMethodName expression, expected Lamba(_ Call(_, _, _))"

type ISomeInterface =
  interface
    abstract SomeMethod: unit -> unit
  end


[<EntryPoint>]
let main argv =
  let name = <@ fun (i : ISomeInterface) -> i.SomeMethod () @> |> getMethodName
  printfn "%s" name

  0