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) =
if col=[] then []
else
let names = "Is" + str
col |> List.filter(fun x-> let t = x.GetType()
if t.GetProperty(names) = null then false
else
t.InvokeMember(names, BindingFlags.GetProperty, null, x, null) :?> bool)
|> List.map(fun y ->
y.GetType().InvokeMember("get_Item", BindingFlags.InvokeMethod, null, y, null))
sp collection "A" |> printfn "%A\n"
sp collection "B" |> printfn "%A\n"
sp collection "C" |> printfn "%A\n"
b3BlbiBTeXN0ZW0uUmVmbGVjdGlvbgoKdHlwZSBUID0KICAgIHwgQSBvZiBpbnQKICAgIHwgQiBvZiBzdHJpbmcKCmxldCBjb2xsZWN0aW9uID0gW0EgMTA7IEIgImFiYyI7IEEgNDA7IEIgIjEyMCJdCgpsZXQgc3AgKGNvbDogVCBsaXN0KSAoc3RyOnN0cmluZykgPSAKICAgICAgaWYgY29sPVtdIHRoZW4gW10KICAgICAgZWxzZSAgCiAgICAgICAgbGV0IG5hbWVzID0gIklzIiArIHN0cgogICAgICAgIGNvbCB8PiBMaXN0LmZpbHRlcihmdW4geC0+IGxldCB0ID0geC5HZXRUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0LkdldFByb3BlcnR5KG5hbWVzKSA9IG51bGwgdGhlbiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5JbnZva2VNZW1iZXIobmFtZXMsIEJpbmRpbmdGbGFncy5HZXRQcm9wZXJ0eSwgbnVsbCwgeCwgbnVsbCkgOj8+IGJvb2wpCiAgICAgICAgICAgIHw+IExpc3QubWFwKGZ1biB5IC0+CiAgICAgICAgICAgICAgICB5LkdldFR5cGUoKS5JbnZva2VNZW1iZXIoImdldF9JdGVtIiwgQmluZGluZ0ZsYWdzLkludm9rZU1ldGhvZCwgbnVsbCwgeSwgbnVsbCkpCiAgICAgCnNwIGNvbGxlY3Rpb24gIkEiIHw+IHByaW50Zm4gIiVBXG4iCnNwIGNvbGxlY3Rpb24gIkIiIHw+IHByaW50Zm4gIiVBXG4iICAgCnNwIGNvbGxlY3Rpb24gIkMiIHw+IHByaW50Zm4gIiVBXG4i