我正在研究几个F#类型提供程序来替换一些半生不熟的代码生成,并且我对提供的扩展基类型的类型存在一些问题。例如,其中一个提供者是实体框架提供者,其中数据库模式的元数据来自外部源,我提供了一种使用DbContext作为其基本类型的类型。该类型具有访问各种DbSet<"表>的属性。成员,但当我尝试访问这些属性时,我收到错误Incorrect instance type. Parameter name: obj
。
我相信这是由于这个'参数(提供的属性的GetterCode和SetterCode中的第一个参数)实际上是DbContext类型,而不是我提供的派生类型。这是有道理的,因为我的上下文类型的ProvideConstructor正在调用DbContext构造函数,但我不确定它还能做什么。我只能猜测我对如何创建类型有些误解。我的类型定义,构造函数和属性的代码如下。如果我做错了事,请告诉我。
let contextType = ProvidedTypeDefinition("MyContext", Some typeof<DbContext>)
let dbContextCtor = typeof<DbContext>.GetConstructor([|typeof<string>|])
let defaultCtor = // Use static parameter 'sqlConnection'
ProvidedConstructor(List.Empty,
BaseConstructorCall = (fun args -> dbContextCtor, args),
InvokeCode = fun args -> Expr.NewObject(dbContextCtor, [ <@@ sqlConnection @@> ]))
let stringCtor =
ProvidedConstructor([ProvidedParameter("sqlConnection", typeof<string>)],
BaseConstructorCall = (fun args -> dbContextCtor, args),
InvokeCode = fun args -> Expr.NewObject(dbContextCtor, [ args.[1] ]))
contextType.AddMember(defaultCtor)
contextType.AddMember(stringCtor)
...
// Add a DbSet field and property for each table to the context type
for providedType in providedTableTypes do
let fieldType = typedefof<DbSet<_>>.MakeGenericType([|providedType|])
let dbSetField = ProvidedField(sprintf "_%s" providedType.Name, fieldType)
let dbSetProperty =
ProvidedProperty(providedType.Name, fieldType,
GetterCode = (fun args -> Expr.FieldGet(args.[0], dbSetField)),
SetterCode = fun args -> Expr.FieldSet(args.[0], dbSetField, args.[1]))
dbSetField.SetFieldAttributes(FieldAttributes.HasDefault)
contextType.AddMember dbSetField
contextType.AddMember dbSetProperty
生成表类型并将DbSet属性添加到上下文类型,但是当我尝试访问其中一个属性时,在评估Incorrect instance type
表达式时收到GetterCode
错误。 / p>