如何将真正的int32 []的System.Object转换为double []?

时间:2010-03-10 21:13:17

标签: f#

我从第三方API获取数据,它只是给了我一个System.Object,我知道这是一个双重的[]。为了处理这种返回类型,我发现下面的代码工作得非常好。但是,我还得到了一些也伪装成System.Object的int []数组,特别是以YYYYMMDD形式的日期(例如20100310)。

转换为float失败,它只是说指定的强制转换是无效的。有没有人知道如何使整数工作?

let oIsNull (obj : System.Object) = obj = null
let oIsArray (obj : System.Object) = obj.GetType().IsArray

let o2f (obj : System.Object) = 
    let mutable arr = [|Double.NaN|]
    if (oIsNull obj = false) && (oIsArray obj = true) then
        let objArr = obj :?> obj[]
        let u = objArr.GetUpperBound(0)
        let floatArr : float[] = Array.zeroCreate (u  + 1);
        for i in 0..u do 
            if objArr.[i] = null then
                floatArr.[i] <- Double.NaN
            else 
                let t = objArr.[i].GetType() 
                floatArr.[i] <- objArr.[i] :?> float 
            //else floatArr.[i] <- float objArr.[i]
        arr <- floatArr
    arr

1 个答案:

答案 0 :(得分:7)

你的意思是你想要

floatArr.[i] <- float (objArr.[i] :?> int)

将对象强制转换为int然后提升为float?

实际上,你可以通过在类型

上使用模式匹配来获得更好的服务
open System

let o2f (obj : System.Object) =
  match obj with
  | :? array<float> as arr -> arr
  | :? array<int> as irr -> irr |> Array.map float 
  | _ -> [|Double.NaN|]