F#中如何将System.Object转换为指定自定义Record类型
解决方案
你需要先解包option类型的MessageObject字段,再通过F#的类型转换运算符将其强转为SingleCorrectRecord类型即可访问对应属性。
1. 确定所有数据符合预期的简化写法
如果可以100%确保所有StatusMessage的MessageObject都是有值的SingleCorrectRecord类型,直接用以下写法:
let getEstimatedVariance(matchedTransactions: StatusMessage list): decimal = matchedTransactions |> Seq.sumBy(fun mt -> (mt.MessageObject.Value :?> SingleCorrectRecord).ExchangeVariance )
用到的语法说明:
Value:用于取出option类型中的有效值,仅当你确定该值一定是Some而非None时使用:?>:F#的向下类型转换运算符,可将父类型System.Object的实例强转为指定的子类型
2. 更安全的模式匹配写法
如果要兼容异常场景避免运行时报错,推荐用模式匹配处理所有可能的情况:
let getEstimatedVariance(matchedTransactions: StatusMessage list): decimal = matchedTransactions |> Seq.sumBy(fun mt -> match mt.MessageObject with | Some (:? SingleCorrectRecord as scr) -> scr.ExchangeVariance | _ -> 0m // 不符合预期的场景可按业务需求调整返回值 )
注:你原代码存在变量名笔误,赋值的变量是
exchangeVariance,最后返回的是不存在的estimatedVariance,上述代码已经修正了该问题。
内容的提问来源于stack exchange,提问作者Martin Thompson
相关产品推荐
相关产品推荐

