我正在使用 F# 4.7<LangVersion>preview</LangVersion>
在我的项目文件中。
我有这样的类型:
type Record = {
Name : string
Description : string
FieldNotInterestedIn: int
}
我想以类型安全的方式获取某些字段的名称,但不是全部。我知道我可以使用反射获取所有字段名称。
这是我想出的最简洁的代码。能再简洁一点吗?
let certainFieldNames =
let r = Unchecked.defaultof<Record>
[
nameof r.Name
nameof r.Description
]
特殊功能nameof
是一个编译时功能,并返回标识符的静态名称。因此,它不能在运行时使用,运行时代码将不包含对该函数的任何引用,结果始终是编译时常量。
因此,您不能将它与管道一起使用,也不能作为第一类函数。当您尝试时,您将收到给定的错误。
您编写的代码是最简洁的,因为您似乎想要获取这些标识符的名称。没有语法方法可以动态地执行此操作(除了反射之外,但这是一种完全不同的方法)。
添加这个特殊函数/运算符的主要原因是为了帮助重命名代码中的操作,或者在异常中安全地使用参数的名称,例如ArgumentNullException
.
完整的详细信息位于 RFC 中,特别是“其他注意事项”部分,其中详细介绍了您的用例:https://github.com/fsharp/fslang-design/blob/master/preview/FS-1003-nameof-operator.md https://github.com/fsharp/fslang-design/blob/master/preview/FS-1003-nameof-operator.md
在实现过程中,针对不需要使用Unchecked.defaultof
,但是如果不对解析器进行重大重写,我们找不到一种好的方法来做到这一点。请注意,该代码不会增加运行时开销,而是会被删除。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)