鉴于这两个被歧视的联盟,我想从案例实例中获取DeclaringType
。
type SingleCaseUnion =
| One
type MultiCaseUnion =
| Two
| Three
每个案例的例子如下:
getDiscriminatedUnionType One = typeof<SingleCaseUnion> // true
getDiscriminatedUnionType Three = typeof<MultiCaseUnion> // true
我的第一次尝试是获取案例类型并获取它的基类,这是有效的,因为在F#中为每个案例创建了一个子类型。
MultiCaseUnion.Two.GetType().BaseType = typeof<MultiCaseUnion> // true
但是,对于单个案例联合,这不起作用,因为没有创建嵌套类型。
SingleCaseUnion.One.GetType().BaseType = typeof<SingleCaseUnion> // false
我的第二次尝试,旨在获得更强大的解决方案是使用FSharp反射助手。
FSharpType.GetUnionCases(unionValue.GetType()).First().DeclaringType
这适用于所有情况,但它必须为每个案例生成UnionCaseInfo实例,这似乎有点不必要。
是否有可能错过的东西?类似的东西:
FSharpValue.GetUnionFromCase(SingleCaseUnion.One)
答案 0 :(得分:4)
怎么样
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