繁体   English   中英

在 F# 中是否有等效于 C# 的 nameof(..)?

[英]Is there an equivalent of C#'s nameof(..) in F#?

我有以下几行代码要从 C# 移植到 F#:

private const string TypeName = nameof(MyClass);
private const string MemberName = nameof(MyClass.MyMember);

TypeName值为"MyClass" ,而MemberName值为"MyMember" 我必须用 F# 写什么?

从 F# 4.7 开始,有一个nameof运算符

let months =
    [
        "January"; "February"; "March"; "April";
        "May"; "June"; "July"; "August"; "September";
        "October"; "November"; "December"
    ]

let lookupMonth month =
    if (month > 12 || month < 1) then
        invalidArg (nameof month) ($"Value passed in was %d{month}.")

    months.[month-1]

printfn "%s" (lookupMonth 12)
printfn "%s" (lookupMonth 1)
printfn "%s" (lookupMonth 13)

正如评论中提到的,运营商的专有nameof正在开发中。

同时,您可以使用 F# 引用(类似于 C# 表达式树)来实现类似的功能——它有点丑陋并且需要一些纪律(您需要将实际成员访问权限放在引用中),但它至少会检查成员存在并防止输入错误:

open Microsoft.FSharp.Quotations

let nameof (q:Expr<_>) = 
  match q with 
  | Patterns.Let(_, _, DerivedPatterns.Lambdas(_, Patterns.Call(_, mi, _))) -> mi.Name
  | Patterns.PropertyGet(_, mi, _) -> mi.Name
  | DerivedPatterns.Lambdas(_, Patterns.Call(_, mi, _)) -> mi.Name
  | _ -> failwith "Unexpected format"

let any<'R> : 'R = failwith "!"

any定义只是一个通用值,您可以使用它来引用实例成员:

nameof <@ any<System.Random>.Next @>
nameof <@ System.Char.IsControl @>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM