我有以下代码行,我想从C#移植到F#:
private const string TypeName = nameof(MyClass);
private const string MemberName = nameof(MyClass.MyMember);
TypeName
的值为"MyClass"
,MemberName
的值为"MyMember"
。我需要用F#写什么?
答案 0 :(得分:10)
正如评论中所提到的,正在进行的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 @>