类型'XmlProvider< ...> .Parameter'不支持运算符'get_Value'吗? [英] The type 'XmlProvider<...>.Parameter' does not support the operator 'get_Value'?

查看:66
本文介绍了类型'XmlProvider< ...> .Parameter'不支持运算符'get_Value'吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何修复代码?内联/静态解析类型与结构化类型一样强大吗?

How to fix the code? Is the inline/Statically Resolved Type the same powerful as structural typing?

类型'XmlProvider< ...>.Parameter'不支持运算符'get_Value'吗?

The type 'XmlProvider<...>.Parameter' does not support the operator '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

推荐答案

Value仅为具有单一类型(或类型提供程序可以统一的类型,例如2和3.0)的节点定义.在您的示例中,第二个值是字符串xxx,因此参数获得两个属性:NumberString,每个属性返回各自类型的option.您可以

Value is only defined for nodes that have a single type (or types the type provider can unify, e.g. 2 and 3.0). In your example the second value is the string xxx, so a parameter gets two properties: Number and String, each returning an option of the respective type. You can either

  • 将您的输入更改为具有一个单一一致的值类型(xxx2)

  • change your input to have one single consistent value type (xxx2)


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))
    

  • 创建适当的DU

  • create an appropriate 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)")
    

  • 如果您不预先知道值,则还可以告诉类型提供程序完全推断它们:

  • if you don't know the values upfront, you can also tell the type provider to not infer them at all:

    XmlProvider<"""...""", InferTypesFromValues=false>
    

    这将导致parameters具有Value : string属性.

    这篇关于类型'XmlProvider&lt; ...&gt; .Parameter'不支持运算符'get_Value'吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆