微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在LINQ to XML中的F#和显式转换

在C#我可以表达这个:

var xe = XElement.Parse("<foo></foo>");
var maybe = (bool?)xe.Element("bar");

如何在F#中表达?

编辑:我确实找到了这个辅助函数

let inline conv (x : ^a) : ^b = ((^a or ^b) : (static member op_Explicit : ^a -> ^b) (x))

解决方法

不幸的是,XLinq在很大程度上依赖于隐式和显式转换,这使事情变得有点困难.

您可以创建例程以从XElement转换为bool选项:

let elementToBool e =
  match e with
    | null -> None
    | e -> Some(XElement.op_Explicit e : bool)

有了这个,你可以写:

let xe = XElement.Parse("<foo><baz>true</baz></foo>")
let bar = xe.Element (XName.op_Implicit "bar") |> elementToBool
let baz = xe.Element (XName.op_Implicit "baz") |> elementToBool

在F#Interactive中,这将转换为:

val bar : bool option = None 
val baz : bool option = Some true

请注意,您可以使用找到的辅助函数,尽管您也需要一个用于op_Implicit调用函数.

使用转换器功能,这会变得更加清洁.我已经调整了上面的代码来使用(略微修改过的版本)转换器帮助程序:

let inline convi (x : ^a) : ^b = ((^a or ^b) : (static member op_Implicit : ^a -> ^b) x)
let inline conve (x : ^a) : ^b = ((^a or ^b) : (static member op_Explicit : ^a -> ^b) x)

let xe = XElement.Parse("<foo><baz>true</baz></foo>")
let elementToBool e =
  match e with
    | null -> None
    | e -> Some(conve e : bool)

let baz = "baz" |> convi |> xe.Element |> elementToBool
let bar = "bar" |> convi |> xe.Element |> elementToBool

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。