I am wondering in the F# code below how to fetch the type associated with each union case via reflection
type AccountCreatedArgs = {
Owner: string
AccountId: Guid
CreatedAt: DateTimeOffset
StartingBalance: decimal
}
type Transaction = {
To: Guid
From: Guid
Description: string
Time: DateTimeOffset
Amount: decimal
}
type AccountEvents =
| AccountCreated of AccountCreatedArgs
| AccountCredited of Transaction
| AccountDebited of Transaction
I tried using FSharpType.GetUnionCases(typeof<AccountEvents>)
but UnionCaseInfo
does not provide any information about the case type (only the declaring type aka AccountEvents
so not really useful in my case) =/
The answer of glennsl really helped me https://stackoverflow.com/a/56351231/4636721
What I really found handy in my case was:
let getUnionCasesTypes<'T> =
Reflection.FSharpType.GetUnionCases(typeof<'T>)
|> Seq.map (fun x -> x.GetFields().[0].DeclaringType)
UnionCaseInfo
has aGetFields
method which returns an array ofPropertyInfo
s which describe each field/argument of the union case. For example:will print
The name assigned to a single field union case is "Item", and if multiple is "Item1", "Item2" etc. The field type itself can be retrieved from the
PropertyType
property ofPropertyInfo
, so:will thus print