F#如何创建所提供类型的实例

F#如何创建所提供类型的实例,f#,type-providers,F#,Type Providers,在创建类型提供程序的步骤中,我为消息提供了一个ProvidedTypeDefinition: // Message type let mTy = ProvidedTypeDefinition(asm, ns, message.Key, Some(typeof<ValueType>), HideObjectMethods = true, IsErased = false) // Direct bu

在创建类型提供程序的步骤中,我为消息提供了一个ProvidedTypeDefinition:

// Message type
          let mTy = ProvidedTypeDefinition(asm, ns, message.Key, Some(typeof<ValueType>), 
                        HideObjectMethods = true, IsErased = false)
          // Direct buffer
          let bufferField = ProvidedField("_directBuffer", typeof<IDirectBuffer>)
          mTy.AddMember bufferField

          let mCtor1 = 
            ProvidedConstructor(
              [ProvidedParameter("buffer", typeof<IDirectBuffer>)], 
              InvokeCode = fun args ->
                match args with
                | [this;buffer] ->
                  Expr.FieldSet (this, bufferField, <@@ %%buffer:IDirectBuffer @@>)
                | _ -> failwith "wrong ctor params"
            )
          mTy.AddMember mCtor1
它还显示
Car
结构存在于测试程序集中(除非我访问
Car
方法,否则此测试程序集构建正常):

但是当我尝试通过如下方法创建汽车时:

type CarSchema = SbeProvider<"Path\to\SBETypeProvider\SBETypeProvider\Car.xml">
module Test =
  let carSchema = CarSchema()
  let car = carSchema.Car(null)
type CarSchema=SbeProvider
模块测试=
设carSchema=carSchema()
let car=carSchema.car(空)
我得到以下错误:

  • 来自编译单元“tmp5CDE”的模块/命名空间“sbetyprovider”不包含命名空间、模块或类型“Car”

  • 在程序集“tmp5CDE”中找到对类型“sbetyprovider.Car”的引用,但在该程序集中找不到该类型

我做错了什么?图中显示的类型在这里。为什么我不能创造它


我查看了GitHub上的许多类型提供程序,但找不到一个清晰的示例,说明如何从另一个提供的类型定义中生成
提供的类型定义。

这可能不是问题所在,但快速一看,问题可能就出在:

let mTy = ProvidedTypeDefinition(asm, ns, message.Key, Some(typeof<ValueType>), 
                        HideObjectMethods = true, IsErased = false)
可能会更好。但是,生成的类型有点像黑色艺术,文档很少,所以您可能(可能?)会发现其他问题


更一般地说,对于创建提供的类型,我通常会返回提供的构造函数作为值,然后使用
Expr.Call
将其嵌入其他属性/函数的调用代码中。这对于已擦除的类型尤其重要,因为反射对它们无论如何都不起作用。

谢谢!今年,这一个错误的过载是几个问题之一,可能是我的问题的主要问题之一!我已经向GitHub StarterPack提交了另一个关于结构的问题。你的名字+图片告诉我,你是主要的贡献者。在浏览了最著名的TPs之后,在F#gurus的帮助下,我现在建立了一个更好的TPs心理模型。重载是主要问题,但仍然有许多“微妙之处”,比如汇编解析。为什么它仍然是你说的“黑色艺术”!?TPs是F#最受赞誉、最酷、最独特、最强大的功能之一,但当涉及到新的实现时,人们确实会迷路。他们一开始确实完全迷路了,就像瞎了的小猫一样:)如何改进文档?
type CarSchema = SbeProvider<"Path\to\SBETypeProvider\SBETypeProvider\Car.xml">
module Test =
  let carSchema = CarSchema()
  let car = carSchema.Car(null)
let mTy = ProvidedTypeDefinition(asm, ns, message.Key, Some(typeof<ValueType>), 
                        HideObjectMethods = true, IsErased = false)
let mTy = ProvidedTypeDefinition(message.Key, Some(typeof<ValueType>), 
                        HideObjectMethods = true, IsErased = false)