给出以下受歧视联盟:
type A = B of string | C of int
Run Code Online (Sandbox Code Playgroud)
如何获取构造函数 B 的名称?
A.B.ToString()
// would return something like:
val it : string = "FSI_0045+it@109-19"
// when I desire
val it : string = "B"
Run Code Online (Sandbox Code Playgroud)
例如,对于这种类型,它可以工作:
type D = E | F
D.E.ToString();;
val it : string = "E"
Run Code Online (Sandbox Code Playgroud)
我通常使用以下命令获取 DU 实例的字符串名称
let stringFromDU (x: 'a) =
match FSharpValue.GetUnionFields(x, typeof<'a>) with
| case, _ -> case.Name
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,我没有实例,我只想序列化标签名称。
如果您启用最新的语言版本,例如通过传递--langversion:preview给 FSI 或设置
<PropertyGroup>
<LangVersion>preview</LangVersion>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
在你的 中.fsproj,以下内容将起作用:
type A = B of int
let n = nameof A.B
Run Code Online (Sandbox Code Playgroud)
注意:对于 F# 5,这将得到开箱即用的支持:-)