2010-06-15 2 views
0

Я пытаюсь перевести код C# на F #.
Но с ошибкой.
Вот код C# с болт. Поз. LINQ Reduces Line Counts and Makes Code “Pop”Как сбросить obj в xml в 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)))) 

| V | S -> новый XElement (r, o) возвращение a XElement
| A -> o |> Array.map (fun z -> obj2xml r z) return a Array
Я не мог понять это!
Я еще не получил его!

Помогите мне пожалуйста!

+5

«Это не работает» не приведет вас к тому, чтобы вы были очень далеко. –

+0

Что именно означает «не работает»? Вы имеете в виду, что это неправильная функция или что она не компилируется/не создается? – ChrisBD

ответ

4

Причина, по которой он не скомпилируется, заключается в том, что все ветви match должны возвращать один и тот же тип объекта. Ваш текущий код возвращает либо XElement, либо Array. Поскольку имя функции obj2xml, я предполагаю, что правильный тип: XElement.

Это означает, что вам необходимо обернуть массив в XElement. Я собираюсь догадаться, что r является коротким для «root», и поскольку все остальные 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.

Смежные вопросы