Is there an equivalent of C#'s nameof(..) in F

2020-02-27 11:03发布

问题:

I have the following lines of code I want to port from C# to F#:

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

The value of TypeName then is "MyClass" and the value of MemberName then is "MyMember". What do I have to write in F#?

回答1:

As mentioned in the comments, a proper nameof operator is work in progress.

In the meantime, you can use F# quotations (similar to C# expression trees) to implement similar functionality - it is a bit uglier and requires some discipline (you need to put actual member access in the quotation), but it at least checks that the member exists and prevents typos:

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 "!"

The any definition is just a generic value that you can use to refer to instance members:

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


标签: c# f#