Reflection 如何获取F中给定联合类型的每个联合案例的类型#

Reflection 如何获取F中给定联合类型的每个联合案例的类型#,reflection,types,f#,discriminated-union,Reflection,Types,F#,Discriminated Union,在下面的F#代码中,我想知道如何通过反射获取与每个联合案例相关联的类型 类型AccountCreatedArgs={ 所有者:字符串 帐户ID:Guid CreatedAt:DateTimeOffset 起始余额:十进制 } 交易类型={ 收件人:Guid 发件人:Guid 描述:字符串 时间:DateTimeOffset 金额:十进制 } 类型AccountEvents= |AccountCreatedArgs的AccountCreated |交易账户 |记入交易借方的账户 我尝试使用FSh

在下面的F#代码中,我想知道如何通过反射获取与每个联合案例相关联的类型

类型AccountCreatedArgs={
所有者:字符串
帐户ID:Guid
CreatedAt:DateTimeOffset
起始余额:十进制
}
交易类型={
收件人:Guid
发件人:Guid
描述:字符串
时间:DateTimeOffset
金额:十进制
}
类型AccountEvents=
|AccountCreatedArgs的AccountCreated
|交易账户
|记入交易借方的账户
我尝试使用
FSharpType.GetUnionCases(typeof

在我的案例中,我真正觉得有用的是:

let getUnionCasesTypes)
|>Seq.map(乐趣x->x.GetFields()[0].DeclaringType)

UnionCaseInfo
有一个
GetFields
方法,该方法返回一个
PropertyInfo
数组,该数组描述union case的每个字段/参数。例如:

FSharpType.GetUnionCases(typeof<AccountEvents>)
    |> Array.map(fun c -> (c.Name, c.GetFields()))
    |> printfn "%A"
分配给单个字段联合大小写的名称为“Item”,如果多个名称为“Item1”、“Item2”等。可以从
PropertyInfo
PropertyType
属性中检索字段类型本身,因此:

FSharpType.GetUnionCases(typeof<AccountEvents>)
    |> Array.map(fun c -> (c.Name, c.GetFields() |> Array.map(fun p -> p.PropertyType.Name)))
    |> printfn "%A"

您已经收到了一个有效的答案,但也许您仍然可以提供一些理由来解释为什么要这样做?将F#和反射结合起来是一条需要谨慎对待的道路。(但如果你知道你在做什么以及为什么,那就很好了。)@Guran我在用Marten和F#,有时候我需要向Marten提供事件类型。我明白了。我(可能)更喜欢一个显式函数,当我的类型发生变化时,我会忍受更新它的烦琐,而不是一直担心我的反射被弄乱,但这是你的选择,也是一个完全无关的问题。@Guran你提出了一个合理的观点,在生产中,这可能是事实,然而,我也只是好奇如何在歧视工会的情况下获取这些类型。好奇本身就是一个正当的理由。中间路线可能是使用类型提供程序,甚至编写自定义类型提供程序。
FSharpType.GetUnionCases(typeof<AccountEvents>)
    |> Array.map(fun c -> (c.Name, c.GetFields() |> Array.map(fun p -> p.PropertyType.Name)))
    |> printfn "%A"
[|("AccountCreated", [|"AccountCreatedArgs"|]);
  ("AccountCredited", [|"Transaction"|]);
  ("AccountDebited", [|"Transaction"|])|]