如何修复代码?内联/静态解析类型与结构类型相同吗?
类型'XmlProvider <...>.参数'不支持运算符'get_Value'?
let input1 = """<r1><parameters><parameter name="token">1</parameter><parameter name="other">xxx</parameter></parameters><othersOf1>..sample....</othersOf1></r1>"""
let xml1 = XmlProvider<"""<r1><parameters><parameter name="token">1</parameter><parameter name="other">xxx</parameter></parameters><othersOf1>...</othersOf1></r1>""">.Parse(input1)
let inline get name parameters =
parameters |> Seq.tryFind (fun x -> (^P : (member Name : 'a) x) = name)
|> Option.map (fun v -> (^P : (member Value : 'b) v))
get "token" xml1.Parameters
Run Code Online (Sandbox Code Playgroud)
Value仅为具有单一类型的节点(或类型提供程序可以统一的类型,例如2和3.0)定义.在您的示例中,第二个值是字符串xxx,因此参数获取两个属性:Number并且String每个属性返回option相应类型的一个.你也可以
将输入更改为具有一个一致的值类型(xxx→ 2)
let xml1 = XmlProvider<"""<r1><parameters><parameter name="token">1</parameter><parameter name="other">2</parameter></parameters><othersOf1>...</othersOf1></r1>""">.Parse(input1)
将它们转换为单一输出类型(例如string)
let inline get name parameters =
parameters |> Seq.tryFind (fun x -> (^P : (member Name : 'a) x) = name)
|> Option.bind (fun v ->
match (^P : (member Number : int option) v) with
| Some number -> Some (string number)
| None -> (^P : (member String : string option) v))
Run Code Online (Sandbox Code Playgroud)创造一个合适的DU
type Value = Number of int | Name of string
let inline get name parameters =
parameters |> Seq.tryFind (fun x -> (^P : (member Name : 'a) x) = name)
|> Option.map (fun v ->
match (^P : (member Number : int option) v) with
| Some number -> Number number
| None ->
match (^P : (member String : string option) v) with
| Some s -> Name s
| _ -> failwith "Either number or string should be Some(value)")
Run Code Online (Sandbox Code Playgroud)如果你不知道前面的值,你也可以告诉类型提供者根本不推断它们:
XmlProvider<"""...""", InferTypesFromValues=false>
Run Code Online (Sandbox Code Playgroud)
这将导致parameters拥有Value : string财产.