代码之家  ›  专栏  ›  技术社区  ›  kev

如何在f中将obj转储到xml#

f#
  •  0
  • kev  · 技术社区  · 16 年前

    我试着将C代码转换为F代码。
    但是失败了。
    这是bolgpost的C代码 LINQ Reduces Line Counts and Makes Code “Pop”

    这是关于FP的。

    我把它翻译成

    #r "System.Core.dll"
    #r "System.Xml.Linq.dll"
    
    open System
    open System.Reflection
    open System.Collections
    open System.Collections.Generic
    open System.Xml.Linq
    
    let (|V|S|A|O|) o =
        if o.GetType().IsValueType then V
        elif o.GetType()=typeof<string> then S
        elif o.GetType().IsArray then A
        else O
    
    let rec obj2xml r o =
        match o with
        | V | S -> new XElement(r, o)
        | A -> o |> Array.map (fun z -> obj2xml r z)
        | O -> new XElement(r, o.GetType().GetProperties() |> Array.map (fun z -> obj2xml (z.Name) (z.GetValue(o, null))))
    

    | V S->新Xelement(R,O) 返回A X元素
    | a->o_gt;array.map(fun z->obj2xml r z) 返回A 数组
    我想不出来!
    我还没有遵守!

    请帮帮我!

    1 回复  |  直到 16 年前
        1
  •  4
  •   Nathan Shively-Sanders    16 年前

    它不编译的原因是 match 必须返回相同类型的对象。当前代码返回 XElement 或 Array . 因为函数的名称是 obj2xml 我想正确的类型是 X元素 .

    这意味着您需要将数组包装在 X元素 不知何故。我会猜到的 r 是“根”的缩写,因为返回的所有其他Xelements R 作为他们的第一个论点,你应该通过。

    | A -> o |> Array.map (fun z -> obj2xml r z)
    // change to:
    | A -> new XElement(r, o |> Array.map (fun z -> obj2xml r z))
    

    顺便说一下,我不知道您是否在使用Visual Studio编写此代码。如果是,那么您可能希望通过项目系统指定引用,而不是 #r 编译器指令。