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, [])