在F#中是否有相当于C#的名字(..)?

Dav*_*vid 13 c# f#

我有以下代码行,我想从C#移植到F#:

private const string TypeName = nameof(MyClass);
private const string MemberName = nameof(MyClass.MyMember);
Run Code Online (Sandbox Code Playgroud)

的价值TypeName则是"MyClass"和的值MemberName,然后是"MyMember".我需要用F#写什么?

Tom*_*cek 11

正如评论中所提到的,正确的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 "!"
Run Code Online (Sandbox Code Playgroud)

any定义只是一个可用于引用实例成员的通用值:

nameof <@ any<System.Random>.Next @>
nameof <@ System.Char.IsControl @>
Run Code Online (Sandbox Code Playgroud)

  • @David - 你是对的,这不是编译时常量,你只能获得成员名称(对于类型名称,你可能只想要`typeof <System.Random> .Name`,但这与C# - 拥有`nameof`会更好!) (4认同)