我有以下几行代码,我想从C#转换到F#:
private const string TypeName = nameof(MyClass);
private const string MemberName = nameof(MyClass.MyMember);
TypeName
的值是"MyClass"
,MemberName
的值是"MyMember"
。我需要在F#中写什么?
我有以下几行代码,我想从C#转换到F#:
private const string TypeName = nameof(MyClass);
private const string MemberName = nameof(MyClass.MyMember);
TypeName
的值是"MyClass"
,MemberName
的值是"MyMember"
。我需要在F#中写什么?
从F# 4.7开始,有一个nameof
运算符:
let months =
[
"January"; "February"; "March"; "April";
"May"; "June"; "July"; "August"; "September";
"October"; "November"; "December"
]
let lookupMonth month =
if (month > 12 || month < 1) then
invalidArg (nameof month) ($"Value passed in was %d{month}.")
months.[month-1]
printfn "%s" (lookupMonth 12)
printfn "%s" (lookupMonth 1)
printfn "%s" (lookupMonth 13)
正如评论中提到的那样,一个适当的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 "!"
< p > any 定义只是一个通用值,您可以使用它来引用实例成员:nameof <@ any<System.Random>.Next @>
nameof <@ System.Char.IsControl @>
nameof
运算符被实现,因为我需要结果作为编译时常量(想将其用作属性的参数)。此外,我是否正确地理解,我只能获取成员的名称,而不能获取类型的名称? - Davidtypeof<System.Random>.Name
,但这与C#中的相同 - 如果有 nameof
将更好!) - Tomas Petricek