open System.Reflection
type T =
| A of int
| B of string
let collection = [A 10; B "abc"; A 40; B "120"]
let sp (col: T list) (str:string) =
match col with
| [] -> []
| _ ->
let names = "Is" + str
col
|> List.choose (fun x ->
let t = x.GetType()
match t.GetProperty(names) with
| null -> None
| pi when unbox(pi.GetValue(x)) ->
Some(t.InvokeMember("get_Item", BindingFlags.InvokeMethod, null, x, null))
| _ -> None)
sp collection "A" |> printfn "%A\n"
sp collection "B" |> printfn "%A\n"
sp collection "C" |> printfn "%A\n"
b3BlbiBTeXN0ZW0uUmVmbGVjdGlvbgogCnR5cGUgVCA9CiAgICB8IEEgb2YgaW50CiAgICB8IEIgb2Ygc3RyaW5nCiAKbGV0IGNvbGxlY3Rpb24gPSBbQSAxMDsgQiAiYWJjIjsgQSA0MDsgQiAiMTIwIl0KIApsZXQgc3AgKGNvbDogVCBsaXN0KSAoc3RyOnN0cmluZykgPSAKICAgIG1hdGNoIGNvbCB3aXRoCiAgICB8IFtdIC0+IFtdCiAgICB8IF8gLT4KICAgICAgICBsZXQgbmFtZXMgPSAiSXMiICsgc3RyCiAgICAgICAgY29sIAogICAgICAgIHw+IExpc3QuY2hvb3NlIChmdW4geCAtPiAKICAgICAgICAgICAgbGV0IHQgPSB4LkdldFR5cGUoKQogICAgICAgICAgICBtYXRjaCB0LkdldFByb3BlcnR5KG5hbWVzKSB3aXRoCiAgICAgICAgICAgIHwgbnVsbCAtPiBOb25lCiAgICAgICAgICAgIHwgcGkgd2hlbiB1bmJveChwaS5HZXRWYWx1ZSh4KSkgLT4KICAgICAgICAgICAgICAgIFNvbWUodC5JbnZva2VNZW1iZXIoImdldF9JdGVtIiwgQmluZGluZ0ZsYWdzLkludm9rZU1ldGhvZCwgbnVsbCwgeCwgbnVsbCkpCiAgICAgICAgICAgIHwgXyAtPiBOb25lKQogCnNwIGNvbGxlY3Rpb24gIkEiIHw+IHByaW50Zm4gIiVBXG4iCnNwIGNvbGxlY3Rpb24gIkIiIHw+IHByaW50Zm4gIiVBXG4iICAgCnNwIGNvbGxlY3Rpb24gIkMiIHw+IHByaW50Zm4gIiVBXG4i