f#泛型类型比较

时间:2010-10-19 19:38:47

标签: generics f# types

我试图弄清楚从通话中返回的obj是否属于某种类型。这是我的代码:

type MyType<'T>= 
    val mutable myArr : array
    val mutable id : int
    val mutable value : 'T

并且在某些方法中,MyType在范围内......

let a  = someFunThatReturnsObj()   // a could be of type MyType 

如何确定a是否为MyType类型?

2 个答案:

答案 0 :(得分:6)

match a with
| :? MyType<int> as mt -> // it's a MyType<int>, use 'mt'
| _ -> // it's not

如果您只关心某个未知MyType<X>的{​​{1}},那么

X

答案 1 :(得分:1)

我不认为这就是那么简单(记得我是天真的)考虑下面的场景

1)我们在多种类型上使用泛型 2)我们没有对象的类型信息,所以它作为类型obj进入函数,就像在某些.NET数据采集/序列化库中一样

我重写了使用反射的提议:

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  

似乎应该有更自然的方式来做这件事......