F# 如何在F中将obj转储为xml#

F# 如何在F中将obj转储为xml#,f#,F#,我尝试将C代码转换为F代码。 但是失败了。 下面是一个名为 是关于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

我尝试将C代码转换为F代码。
但是失败了。
下面是一个名为

是关于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))))
#r“System.Core.dll”
#r“System.Xml.Linq.dll”
开放系统
开放系统。反射
开放系统。集合
open System.Collections.Generic
open System.Xml.Linq
让(| V | S | A | O |)O=
如果o.GetType().IsValueType,则V
elif o.GetType()=类型,然后是S
elif o.GetType().IsArray然后是
埃尔索
让rec obj2xml r o=
匹配
|V | S->新元素(r,o)
|A->o |>Array.map(funz->obj2xmlrz)
|O->new-XElement(r,O.GetType().GetProperties()|>Array.map(fun z->obj2xml(z.Name)(z.GetValue(O,null)))
|V | S->新建元素(r,o)返回一个元素
|A->o|>Array.map(funz->obj2xmlrz)返回A数组
我想不出来!
我还没完成呢


请帮帮我

它不会编译的原因是
match
的所有分支都必须返回相同类型的对象。当前代码返回
XElement
数组
。由于函数的名称是
obj2xml
,我猜正确的类型是
XElement

这意味着您需要以某种方式将数组包装在
XElement
中。我猜
r
是“root”的缩写,因为所有其他返回的元素都将
r
作为第一个参数,所以您应该传递它

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

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

它不编译的原因是
匹配的所有分支都必须返回相同类型的对象。当前代码返回
XElement
数组
。由于函数的名称是
obj2xml
,我猜正确的类型是
XElement

这意味着您需要以某种方式将数组包装在
XElement
中。我猜
r
是“root”的缩写,因为所有其他返回的元素都将
r
作为第一个参数,所以您应该传递它

| A -> o |> Array.map (fun z -> obj2xml r z)
// change to:
| A -> new XElement(r, o |> Array.map (fun z -> obj2xml r z))
顺便说一下,我不知道您是否正在使用VisualStudio编写此代码。如果是,那么您可能希望通过项目系统而不是
\r
编译器指令来指定引用。

“它不工作”不会让您走得很远。“不工作”到底是什么意思?你是说它的功能不正确,还是说它不编译/构建?“它不工作”不会让你走得很远。“不工作”到底是什么意思?你是说它的功能不正确还是说它没有编译/构建?