F#类型提供程序-嵌套属性实例化

F#类型提供程序-嵌套属性实例化,f#,type-providers,quotations,F#,Type Providers,Quotations,我正试图建立我的第一个玩具式类型供应商。我试图实现的是动态生成动态生成类型的属性 collection |> getItems |> Seq.map(fun mapItem -> let nestedType = ProvidedTypeDefinition(assembly, ns, "MyNestedType", None) let ctor = ProvidedConstructor(List.Empty) nestedT

我正试图建立我的第一个玩具式类型供应商。我试图实现的是动态生成动态生成类型的属性

collection 
|> getItems
|> Seq.map(fun mapItem ->            
    let nestedType = ProvidedTypeDefinition(assembly, ns, "MyNestedType", None)
    let ctor = ProvidedConstructor(List.Empty)
    nestedType.AddMember ctor
    mapItem.Value 
        |> Seq.map(fun pair -> 
        ProvidedProperty(fst(pair), typeof<string>,
            GetterCode = fun [_] -> <@@ snd(pair) @@>))
        |> Seq.toList
        |> nestedType.AddMembers


    ProvidedProperty(mapItem.Key, nestedType,
        GetterCode = fun [map] ->   
            // ?? Runtime Exception   
            let inst = nestedType.GetConstructors().[0].Invoke([||])             
            <@@ inst @@>
                ))
    |> Seq.toList
    |> ty.AddMembers      

ty
收藏
|>获取项目
|>序列地图(趣味地图项目->
让nestedType=ProvidedTypeDefinition(程序集,ns,“MyNestedType”,无)
让ctor=ProvidedConstructor(List.Empty)
nestedType.AddMember构造函数
mapItem.Value
|>序列图(趣味配对->
提供的属性(fst(对),类型,
GetterCode=fun[\u]->)
|>序号:toList
|>nestedType.AddMembers
ProvidedProperty(mapItem.Key、nestedType、,
GetterCode=fun[map]>
//??运行时异常
让inst=nestedType.GetConstructors()[0]。调用([| |])
))
|>序号:toList
|>ty.AddMembers
泰

我应该如何实例化动态生成的类型?

我假设这是一个擦除类型提供程序(这些是最简单的,所以它们是入门的最佳选择)。如果不是这样,那就不要理会我的回答

GetterCode
中,不需要创建嵌套提供类型的实例。您只需要创建它被擦除到的类型的实例

在您的情况下,
nestedType
被擦除为
None
,因此构造函数只需要创建一个
System.Object
值,因此您应该能够使用:

ProvidedProperty(mapItem.Key, nestedType,
    GetterCode = fun [self] -> <@@ obj() @@>)

请注意,我正在使用
let
捕获基元
参数
类型的值,以便编译器可以序列化引号(您无法在引号中捕获复杂的对象类型)。

这里尝试的是在构建提供程序时实例化您的类型,然后在属性体中包含该新实例。应该非常清楚的是,在完成提供之前,不能实例化提供的类型

您真正想要做的是使用提供的构造函数并构建一个调用它的引用。您不能让编译器为您构建引用,因为为了让编译器编译引用的主体,它需要“查看”其中的所有类型/方法/函数,而您的类型尚未准备就绪。但是您可以使用
quotes.Expr
下的各种构造函数手动创建报价单。在这种情况下,
NewObject
是合适的:

    GetterCode = fun [map] -> Expr.NewObject (ctor, [])

谢谢,我现在明白了擦除类型是如何工作的。问题是,在类型提供程序的编译时,我不知道属性的名称,所以如果我没有错的话,我可以只删除对象。我试图实现的只是这样的东西:providedType.dynamicy_generated_prop.dynamicy_generated_prop_nested,在使用提供程序时
    GetterCode = fun [map] -> Expr.NewObject (ctor, [])