鉴于这两个歧视工会,我想得到 DeclaringType
从一个案例来看。
type SingleCaseUnion =
| One
type MultiCaseUnion =
| Two
| Three
每种情况的示例如下:
getDiscriminatedUnionType One = typeof<SingleCaseUnion> // true
getDiscriminatedUnionType Three = typeof<MultiCaseUnion> // true
我的第一次尝试是获取 case 类型并获取它的基类,这是有效的,因为在 F# 中为每个 case 创建了一个子类型。
MultiCaseUnion.Two.GetType().BaseType = typeof<MultiCaseUnion> // true
但是,对于单个 case union 这不起作用,因为没有创建嵌套类型。
SingleCaseUnion.One.GetType().BaseType = typeof<SingleCaseUnion> // false
我的第二次尝试,旨在获得更强大的解决方案是使用 FSharp 反射助手。
FSharpType.GetUnionCases(unionValue.GetType()).First().DeclaringType
这确实适用于所有情况,但它必须为每种情况生成 UnionCaseInfo 实例,这似乎有些不必要。
是否有内置的东西我可能错过了?就像是:
FSharpValue.GetUnionFromCase(SingleCaseUnion.One)
最佳答案
怎么样
open FSharp.Reflection
type FSharpType =
static member GetUnionType t =
let ownType = t.GetType()
assert FSharpType.IsUnion(ownType)
let baseType = ownType.BaseType
if baseType = typeof<System.Object> then ownType else baseType
测试:
(FSharpType.GetUnionType MultiCaseUnion.Three).Name //MultiCaseUnion
(FSharpType.GetUnionType SingleCaseUnion.One).Name //SingleCaseUnion
关于reflection - 如何从 Case 实例中获取 Discriminated Union Type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41255133/