F# 获取F中非静态成员的名称#
在C#中,可以使用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
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#名称
性能和这些基于报价的技术,则使用报价的开销可能会更大。