Свойства f # типов в непоследовательном порядке и слегка отличающихся типов - PullRequest
0 голосов
/ 08 июня 2010

Я пытаюсь перебрать массив объектов и рекурсивно распечатать свойства каждого объекта.
Вот моя объектная модель:

type firmIdentifier = {
    firmId: int ;
    firmName: string ;
}
type authorIdentifier = {
    authorId: int ;
    authorName: string ;
    firm: firmIdentifier ;
}

type denormalizedSuggestedTradeRecommendations = {
    id: int ; 
    ticker: string ;
    direction: string ;
    author: authorIdentifier ;
}

Вот как я создаю экземпляры своих объектов:

let getMyIdeasIdeas = [|
     {id=1; ticker="msfqt"; direction="buy"; 
        author={authorId=0; authorName="john Smith"; firm={firmId=12; firmName="Firm1"}};};

     {id=2; ticker="goog"; direction="sell"; 
        author={authorId=1; authorName="Bill Jones"; firm={firmId=13; firmName="ABC Financial"}};};

     {id=3; ticker="DFHF"; direction="buy"; 
        author={authorId=2; authorName="Ron James"; firm={firmId=2; firmName="DEFFirm"}};}|]

А вот мой алгоритм для итерации, рекурсии и печати:

let rec recurseObj  (sb : StringBuilder) o=
            let props : PropertyInfo [] = o.GetType().GetProperties()
            sb.Append( o.GetType().ToString()) |> ignore
            for x in props do
                let getMethod = x.GetGetMethod()
                let value = getMethod.Invoke(o, Array.empty)
                ignore <|
                        match value with
                        | :? float  | :? int | :? string | :? bool as f -> sb.Append(x.Name + ": " + f.ToString() + "," ) |> ignore
                        | _ ->  recurseObj  sb value
 for x in getMyIdeas do
                recurseObj sb x
                sb.Append("\r\n") |> ignore

Если вы не можете сказать, я пытаюсь создать CSV-файл и распечатываю типы для целей отладки. Проблема в том, что первый элемент проходит в том порядке, в котором вы ожидаете, но все последующие элементы проходят через несколько иной (и запутанный) порядок «дочерних» свойств, например:

RpcMethods + denormalizedSuggestedTradeRecommendationsid: 1, тикер: msfqt, направление: купить, RpcMethods + authorIdentifierauthorId: 0, authorName: Джон Смит, RpcMethods + firmIdentifierfirmId: 12, фирменное наименование: Фирменное1,

RpcMethods + denormalizedSuggestedTradeRecommendationsid: 2, тикер: goog, направление: продать, RpcMethods + authorIdentifierauthorName: Билл Джонс, RpcMethods + firmIdentifierfirmName: ABC Financial, код фирмы: 13, код автора: 1,

RpcMethods + denormalizedSuggestedTradeRecommendationsid: 3, тикер: DFHF, направление: купить, RpcMethods + authorIdentifierauthorName: Рон Джеймс, RpcMethods + firmIdentifierfirmName: DEFFirm, firmId: 2, authorId: 2,

Есть идеи, что здесь происходит?

Ответы [ 2 ]

1 голос
/ 08 июня 2010

Помогает ли это добавить?

        for x in props |> Array.sortBy (fun p -> p.Name) do 
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

В общем, я думаю, что отражение возвращает сущности (например, атрибуты, методы, свойства) в неуказанном порядке. Так что просто выберите фиксированный порядок сортировки?

(Или я неправильно понял проблему?)

0 голосов
/ 15 июня 2010

Это вещь отражения.Вы не можете полагаться на порядок свойств, используя отражение.Мне нужно отсортировать с помощью MetaTokens.Я опубликую это решение, когда приступлю к его реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...