Как преобразовать System.Object, который действительно является int32 [], в double []? - PullRequest
2 голосов
/ 11 марта 2010

Я получаю данные от стороннего API, который просто возвращает мне System.Object, который, как я знаю, является двойным [] под одеялом. И чтобы разобраться с этим типом возврата, я обнаружил, что приведенный ниже код прекрасно работает. Однако я также получаю некоторые массивы int [], которые также маскируются под System.Object, в частности даты в виде ГГГГММДД (например, 20100310).

Преобразование в число с плавающей точкой завершается неудачно, и оно просто говорит, что указанное приведение недействительно. Кто-нибудь знает, как заставить это работать для целых чисел?

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 Ответ

7 голосов
/ 11 марта 2010

Вы имеете в виду, что вы хотите, чтобы

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

выполнял приведение объекта к int, а затем повышал его до плавающего?

На самом деле вам лучше будет использовать сопоставление с образцом для типов вдольлинии

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|]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...