C#からF#に移植したい次のコード行があります。
private const string TypeName = nameof(MyClass);
private const string MemberName = nameof(MyClass.MyMember);
TypeName
の値は"MyClass"
そしてMemberName
の値は"MyMember"
。 F#で何を書く必要がありますか?
コメントで述べたように、適切な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 @>