在我创建类型提供程序的第一次尝试中,我有一个用于消息的ProvidedTypeDefinition:
我需要在另一个提供的类型的方法中创建该类型的实例。我正在执行以下操作:
ILSpy显示以下C#代码,对应于该方法:
我遇到了以下错误:
// 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
结构体存在于测试程序集中(只有当我访问Car
方法时,这个测试程序集才能正常构建):
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
。