这应该工作:
let randInst<'t>() =
let cases = Reflection.FSharpType.GetUnionCases(typeof<'t>)
let index = System.Random().Next(cases.Length)
let case = cases.[index]
Reflection.FSharpValue.MakeUnion(case, [||]) :?> 't
Run Code Online (Sandbox Code Playgroud)
此代码假定union情况都是无效的,并且您使用的类型实际上是一个联合类型,但是如果需要,可以很容易地显式检查这些假设并抛出有意义的异常.