web-dev-qa-db-ja.com

F#にC#のnameof(..)に相当するものはありますか?

C#からF#に移植したい次のコード行があります。

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

TypeNameの値は"MyClass"そしてMemberNameの値は"MyMember"。 F#で何を書く必要がありますか?

16
David

コメントで述べたように、適切な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 @>
12
Tomas Petricek