如何从 invoke in type provider 的引用中调用函数?
How to call a function from the quotation of a invoke in type provider?
我有一个类型提供程序,它给我错误 "Type mismatch when splicing expression into quotation literal"。
我提取了下面的代码以便在较小的上下文中重现该问题。
let f (s : string) : string = s //some dummy implementation
let t = ProvidedTypeDefinition(asm, ns, "Root", Some typeof<obj>)
let ctor = ProvidedConstructor(parameters = [],
InvokeCode = (fun args -> <@@ "root" :> obj @@>)) :> MemberInfo
let prop = ProvidedProperty(propertyName = "SomeProperty",
parameters = [],
propertyType = typeof<string>,
GetterCode = (fun args -> <@@ f %%(args.[0]) @@>)) :> MemberInfo
do t.AddMembers [ctor; prop]
t.SetBaseType typeof<obj>
...当我使用
这样的类型提供程序时
let root = Provided.Root()
let a = root.SomeProperty
我收到错误:
Error: The type provider 'typeproviders.providerpoc+MyProvider' reported an error in the context of provided type
'typeproviders.providerpoc.Provided.Root', member 'get_Menu'.
The error: Type mismatch when splicing expression into quotation
literal.
The type of the expression tree being inserted doesn't match
the type expected by the splicing operation.
Expected 'System.Object', but received type 'System.String'.
Consider type-annotating with the expected expression type, e.g., (%% x :
string) or (%x : string).. Parameter name: receivedType.
如何编写引文才能在引文中调用函数?
谢谢!
错误消息的意思是,您将 obj
类型的引用表达式放在需要 string
类型的引用表达式的位置。
我怀疑在提供的 属性:
中创建 GetterCode
时会发生这种情况
GetterCode = (fun args -> <@@ f %%(args.[0]) @@>)
这里,args
是一个引用表达式数组,其中每个表达式都是 obj
类型,但是函数 f
需要一个字符串,因此引用使用 %%
应该是类型 string
添加将 obj
转换为 string
的类型转换应该可以解决问题:
GetterCode = (fun args -> <@@ f (unbox<string> (%%(args.[0]))) @@>)
我有一个类型提供程序,它给我错误 "Type mismatch when splicing expression into quotation literal"。
我提取了下面的代码以便在较小的上下文中重现该问题。
let f (s : string) : string = s //some dummy implementation
let t = ProvidedTypeDefinition(asm, ns, "Root", Some typeof<obj>)
let ctor = ProvidedConstructor(parameters = [],
InvokeCode = (fun args -> <@@ "root" :> obj @@>)) :> MemberInfo
let prop = ProvidedProperty(propertyName = "SomeProperty",
parameters = [],
propertyType = typeof<string>,
GetterCode = (fun args -> <@@ f %%(args.[0]) @@>)) :> MemberInfo
do t.AddMembers [ctor; prop]
t.SetBaseType typeof<obj>
...当我使用
这样的类型提供程序时let root = Provided.Root()
let a = root.SomeProperty
我收到错误:
Error: The type provider 'typeproviders.providerpoc+MyProvider' reported an error in the context of provided type 'typeproviders.providerpoc.Provided.Root', member 'get_Menu'.
The error: Type mismatch when splicing expression into quotation literal.
The type of the expression tree being inserted doesn't match the type expected by the splicing operation.
Expected 'System.Object', but received type 'System.String'.
Consider type-annotating with the expected expression type, e.g., (%% x : string) or (%x : string).. Parameter name: receivedType.
如何编写引文才能在引文中调用函数?
谢谢!
错误消息的意思是,您将 obj
类型的引用表达式放在需要 string
类型的引用表达式的位置。
我怀疑在提供的 属性:
中创建GetterCode
时会发生这种情况
GetterCode = (fun args -> <@@ f %%(args.[0]) @@>)
这里,args
是一个引用表达式数组,其中每个表达式都是 obj
类型,但是函数 f
需要一个字符串,因此引用使用 %%
应该是类型 string
添加将 obj
转换为 string
的类型转换应该可以解决问题:
GetterCode = (fun args -> <@@ f (unbox<string> (%%(args.[0]))) @@>)