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

F# 获取F中非静态成员的名称#,f#,F#,在C#中,可以使用 nameof(ISomeClass.SomeMethod) 这在F#中可行吗?当试图点入ISomeClass以获得SomeMethod时,它只会说“SomeMethod不是静态方法”您可以基于F#引号创建一个方法,以类型安全的方式检索接口方法 open FSharp.Quotations open FSharp.Quotations.Patterns let getMethodName (e: Expr<'T -> 'U>) = match e w

在C#中,可以使用

nameof(ISomeClass.SomeMethod)

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

您可以基于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
打开FSharp.quotes
打开FSharp.quotes.Patterns
让getMethodName(e:Expr)=
匹配
|Lambda(u,Call(u,mi,))->mi.Name
|“>failwith”%A不是有效的getMethodName表达式,应为Lamba(Call(,,,,))”
类型接口=
接口
抽象方法:单元->单元
结束
[]
让主argv=
让name=i.SomeMethod()@>|>getMethodName
printfn“%s”名称
0

看起来设计已经批准,但尚未实施:很高兴听到这一点,但问题不仅仅在于运营商的名字。即使使用一些在这个网站上使用引号建议的工作区名称,我仍然得到“SomeMethod不是静态方法”的问题。基本上,它不会让我像在C#中一样,以这种方式进入非静态方法。您可以创建一个引号,允许您获取非静态方法接口方法的名称。我尝试过但没有成功,您是如何做到的?请参阅下面的答案。有趣的解决方案,谢谢!重新阅读后,它似乎也解决了这个问题,您只需在该答案中使用any运算符即可。无论哪种方式,两种不同的解决方案都非常有效。类似的技术可用于查找MethodInfo、PropertyInfo、ConstructorInfo等。这在C#中是可行的,也可以使用
表达式
。但是,如果您比较C#
名称
性能和这些基于报价的技术,则使用报价的开销可能会更大。