f # Сравнение универсальных типов - PullRequest
6 голосов
/ 19 октября 2010

Я пытаюсь выяснить, является ли объект, возвращаемый из вызова, определенного типа.Вот мой код:

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 

Как выяснить, имеет ли тип MyType?

Ответы [ 2 ]

6 голосов
/ 19 октября 2010
match a with
| :? MyType<int> as mt -> // it's a MyType<int>, use 'mt'
| _ -> // it's not

Если вам нужна только MyType<X> для какого-то неизвестного X, тогда

let t = a.GetType()
if t.IsGenericType && t.GetGenericTypeDefinition() = typedefof<MyType<int>> then
    // it is
1 голос
/ 20 октября 2010

Я не думаю, что это так просто (помните, я чертовски наивен), рассмотрим следующий сценарий, где

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  

Похоже, должен быть более естественный способ сделать это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...