在F#中创建提供的类型列表

时间:2012-03-05 04:31:22

标签: types f# type-providers

我正在尝试向fsharpx添加基本的JSON类型提供程序。 目前我正在使用JSON Arrays。请考虑以下测试用例:

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"

我的想法是,我想使用数组中的第一个元素来获取集合元素的类型。然后我想在SimpleArray类型中添加一个属性“items”,它给出了这个新类型的列表。

代码可以在github repo 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 个答案:

答案 0 :(得分:3)

究竟是什么问题?看起来您需要提供多种类型(例如,在您的示例中,您的外部类型包含items,然后是包含id的内部类型)。您可能希望内部类型是外部类型中的嵌套类型。然后,您将提供的items属性包含内部类型的列表。你遇到麻烦的那个方面有哪些方面?

修改

如果您只想知道如何创建Type实例,请尝试

typedefof<_ list>.MakeGenericType(newType)

这假设它本身的基础值为obj list,这是newType删除obj后必需的。