如何从 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]))) @@>)