Создание списка предоставленного типа в F # - PullRequest
3 голосов
/ 05 марта 2012

Я пытаюсь добавить базового поставщика типа JSON в fsharpx . На данный момент я борюсь с массивами JSON. Рассмотрим следующий тестовый пример:

type SimpleArray = JSON< "{\"items\":[{\"id\":\"Open\"},{\"id\":\"Pause\"}]}">

let a = SimpleArray()

[<Test>] 
let ``Can parse simple arrays``() = 
    a.items.[0].id
    |> should equal "Open"

    a.items.[1].id
    |> should equal "Pause"

Идея состоит в том, что я хочу использовать первый элемент в массиве, чтобы получить тип элементов коллекции. Затем я хочу добавить свойство «items» к типу SimpleArray, которое дает список этого нового типа.

Код можно найти в репозитории github Github . Интересная часть начинается со строки 38. Как видите, все это должно быть рекурсивным, поскольку JArray также может содержать вложенные JArrays.

| JArray list ->
    let newType = annotateAsJson list.[0] (runtimeType<obj> (ownerTy.Name + "_" + e.Key))
    ownerTy.AddMember newType
    Some(provideProperty
            e.Key
            newType // TODO: make this a list
            (fun args -> Expr.Coerce(<@@ (%%args.[0] : obj) @@>, newType)) // TODO: return the list
            :> MemberInfo)

Спасибо, Штеффен

1 Ответ

3 голосов
/ 05 марта 2012

Какой именно вопрос? Похоже, вам нужно предоставить несколько типов (например, в вашем примере у вас есть внешний тип, содержащий items, а затем внутренний тип, содержащий id). Вы, вероятно, хотите, чтобы внутренний тип был вложенным типом во внешнем типе. Затем вы создаете свойство items, содержащее список внутреннего типа. Есть ли определенный аспект того, с чем у вас проблемы?

EDIT

Если вам просто интересно, как создать сам экземпляр Type, пробовали ли вы

typedefof<_ list>.MakeGenericType(newType)

Это предполагает, что базовое значение само по себе является obj list, что необходимо, поскольку newType стирает до obj.

...