如何枚举一个有区别的联合以获得名称和类型实例,用F#表示?
首先,我读到这篇文章:但它并不能真正解决我的问题 我试图解析一个有区别的联合,获取所有类型,获取它们的名称,然后将它们放入字典中(好吧,不止这些,但这是为了简化示例)如何枚举一个有区别的联合以获得名称和类型实例,用F#表示?,f#,discriminated-union,F#,Discriminated Union,首先,我读到这篇文章:但它并不能真正解决我的问题 我试图解析一个有区别的联合,获取所有类型,获取它们的名称,然后将它们放入字典中(好吧,不止这些,但这是为了简化示例) 打开Microsoft.FSharp.Reflection MyDU型= |A型 |B型 设l=字典() FSharpType.GetUnionCases类型 |>序号:iter(乐趣x-> l、 [我在这里放什么?]您可以使用FSharpValue.MakeUnion函数使用F#反射创建DU的实例: for x in FShar
打开Microsoft.FSharp.Reflection
MyDU型=
|A型
|B型
设l=字典()
FSharpType.GetUnionCases类型
|>序号:iter(乐趣x->
l、 [我在这里放什么?]您可以使用FSharpValue.MakeUnion
函数使用F#反射创建DU的实例:
for x in FSharpType.GetUnionCases typeof<MyDU> do
l.[FSharpValue.MakeUnion(x, [||]) :?> MyDU] <- x.Name
FSharpType.GetUnionCases typeof do中x的
l、 [FSharpValue.MakeUnion(x,[| |]]:?>MyDU]对于一些简单的东西来说,这似乎是一个很大的麻烦,给你的DU一个返回所有实例的静态成员可能会容易得多。但是为什么你首先需要这个呢?如果任何实例有一些字段,你无论如何都无法实例化它,至少没有用。DU与枚举有根本的不同(后者是一个简单的本机int,而DU是一个用于各种数据的框)。原因是它用于公共代码中,我想确保在添加类型时,匹配它们的代码将无法编译(因此DU而不是enum)用于不覆盖所有情况。但某些数据流名称是使用“枚举”名称生成的,因此我需要能够对它们进行迭代并提取名称。听起来您应该使用序列化和反序列化作为更简单的解决方案。DU不适用于这种类型的枚举,但这是可能的。
Enum.GetValues(typeof<MyEnum>)
|> unbox
|> Seq.iter (fun x ->
l.[x] <- string x
for x in FSharpType.GetUnionCases typeof<MyDU> do
l.[FSharpValue.MakeUnion(x, [||]) :?> MyDU] <- x.Name