Я не думаю, что это так просто (помните, я чертовски наивен), рассмотрим следующий сценарий, где
1) мы используем дженерики для нескольких типов
2) у нас нет информации о типе объекта, поэтому она входит в функцию типа obj, как в некоторых библиотеках .NET datacontract / serialization
Я переработал свое предложение об использовании отражения:
type SomeType<'A> = {
item : 'A
}
type AnotherType<'A> = {
someList : 'A list
}
let test() =
let getIt() : obj =
let results : SomeType<AnotherType<int>> = { item = { someList = [1;2;3] }}
upcast results
let doSomething (results : obj) =
let resultsType = results.GetType()
if resultsType.GetGenericTypeDefinition() = typedefof<SomeType<_>> then
let method = resultsType.GetMethod("get_item")
if method <> null then
let arr = method.Invoke(results, [||])
if arr.GetType().GetGenericTypeDefinition() = typedefof<AnotherType<_>> then
printfn "match"
getIt() |> doSomething
Похоже, должен быть более естественный способ сделать это ...