【问题标题】:f# generic type comparisonf# 泛型类型比较
【发布时间】:2011-04-27 16:30:27
【问题描述】:

我试图确定从调用返回的 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 类型?

【问题讨论】:

  • 嗯,运行时类型检查?你知道你的方法返回什么类型吗?如果是这样,也许您可​​以将类型包装在类型安全的联合中并改用模式匹配,也许您在该函数中的类型可以公开一个通用接口?您可以做很多事情来避免运行时类型检查。
  • 如果你不知道返回的类型是什么?请参阅下面的帖子 AS T1> is Different thean T1> 如果您只关心 T1 的对象而不考虑其他细节怎么办?

标签: generics f# types


【解决方案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  

似乎应该有更自然的方式来做到这一点......

【讨论】:

  • 这对于确定结果是否属于我想要的 SomeType> 类别非常有用。我仍然面临的问题是将结果转换为 SomeType>。我可以控制一切不可能的事情。任何人都可以通过对所有对象使用通用接口来建议一种方法吗?也许是一个共同的超类?
【解决方案2】:
match a with
| :? MyType<int> as mt -> // it's a MyType<int>, use 'mt'
| _ -> // it's not

如果您只关心MyType&lt;X&gt; 对一些未知的X,那么

let t = a.GetType()
if t.IsGenericType && t.GetGenericTypeDefinition() = typedefof<MyType<int>> then
    // it is

【讨论】:

  • 看来我还有另一个问题。看来 someFunThatReturnsObj() 返回 'U.使用您建议的第一个方法,我得到:“从 'U 类型到 MyType 的运行时强制或类型测试涉及基于此程序点之前的信息的不确定类型。某些类型不允许运行时类型测试。进一步类型需要注释。”
  • 先调用'box',然后。 "匹配框 a 与..."
  • 我不确定你所说的“盒子”布赖恩是什么意思?
  • 调用box 函数,该函数将其参数向上转换为类型obj
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多