gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:29:12 29 4
gpt4 key购买 nike

在我的 first attempt要创建类型提供程序,我有一条消息的 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

然后我需要在另一个提供类型的方法中创建该类型的实例。我正在这样做:
let mMethod = ProvidedMethod(message.Key, [ProvidedParameter("buffer", typeof<IDirectBuffer>)], mTy)
mMethod.InvokeCode <- (fun [this;buffer] ->
let c = mTy.GetConstructors().Last()
Expr.NewObject(c, [ buffer ])
)

ILSpy 显示了该方法的以下等效 C# 代码:
public Car Car(IDirectBuffer buffer)
{
return new Car(buffer);
}

它还表明 Car struct 存在于测试程序集中(除非我访问 Car 方法,否则此测试程序集构建正常):

enter image description here

但是当我尝试通过这样的方法创建汽车时:
type CarSchema = SbeProvider<"Path\to\SBETypeProvider\SBETypeProvider\Car.xml">
module Test =
let carSchema = CarSchema()
let car = carSchema.Car(null)

我收到以下错误:
  • 来自编译单元“tmp5CDE”的模块/命名空间“SBETypeProvider”不包含命名空间、模块或类型“Car”
  • 在程序集“tmp5CDE”中找到对类型“SBETypeProvider.Car”的引用,但在该程序集中找不到该类型

  • 我做错了什么?图片显示类型在这里。为什么我不能创建它?

    我浏览了 GitHub 上的许多类型提供程序,但找不到一个明确的示例如何生成 ProvidedTypeDefinition从另一个。

    最佳答案

    这可能不是问题,但乍一看,它看起来像 line you linked实际上可能是问题所在:

    let mTy = ProvidedTypeDefinition(asm, ns, message.Key, Some(typeof<ValueType>), 
    HideObjectMethods = true, IsErased = false)

    此类型正在添加到 ty提供的类型(将实际写入临时程序集的类型),因此不应自行指定程序集和命名空间。
    let mTy = ProvidedTypeDefinition(message.Key, Some(typeof<ValueType>), 
    HideObjectMethods = true, IsErased = false)

    可能工作得更好。生成的类型虽然有点像魔法,但文档很少,所以有可能(很可能?)您可能会发现其他问题。

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

    关于F#如何创建提供类型的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35145148/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com