Как уже указывалось, прямого способа сделать это невозможно (сопоставление с образцом может связывать только значения, но не может связывать переменные нового типа).В дополнение к (более общему) обходу kvb вы можете использовать тот факт, что все коллекции реализуют неуниверсальные IEnumerable
, поэтому вы можете проверить этот тип:
match box value with
| :? System.Collections.IEnumerable as l when
// assumes that the actual type of 'l' is 'List<T>' or some other type
// with single generic type parameter (this is not fully correct, because
// it could be other type too, but we can ignore this for now)
typedefof<SomeType>.IsAssignableFrom
(value.GetType().GetGenericArguments().[0]) ->
l |> Seq.cast<SomeType>
| _ -> failwith "doesn't match"
Код проверяет, является ли значение не универсальным IEnumerable
и является ли параметр типа подтипом SomeType
.В этом случае мы получили список некоторого производного типа, поэтому мы можем привести его к последовательности значений SomeType
(это немного отличается от работы со списком значений производных типов, но это не должно иметь значения для практического применения).цели).