您如何从Case实例中获得Discriminated Union Type?

时间:2016-12-21 04:31:08

标签: reflection f# discriminated-union

鉴于这两个被歧视的联盟,我想从案例实例中获取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)

1 个答案:

答案 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