受歧视联盟标签到字符串

Cod*_*gar 2 f#

给出以下受歧视联盟:

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)

但在这种情况下,我没有实例,我只想序列化标签名称。

Car*_*Dev 5

如果您启用最新的语言版本,例如通过传递--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,这将得到开箱即用的支持:-)