У меня есть этот базовый генеративный провайдер типа F #
[<TypeProvider>]
type MyTypeProvider(config : TypeProviderConfig) as this =
inherit TypeProviderForNamespaces(config)
let ns = "MyNamespace"
let asm = Assembly.LoadFrom(config.RuntimeAssembly)
let buildTypes (typeName:string) (args:obj[]) =
let asm = ProvidedAssembly()
let srvName = args.[0] :?> string
... omitted
let provided = ProvidedTypeDefinition(asm, ns, typeName, Some typeof<MyRuntimeType>, hideObjectMethods = true, nonNullable = true, isErased = false)
let ctor = ProvidedConstructor([], (fun _ -> <@@ MyRuntimeType() @@>))
provided.AddMember(ctor)
provided
let parameters =
[ ProvidedStaticParameter("Host", typeof<string>, "") ]
let provider = ProvidedTypeDefinition(asm, ns, "MyProvider", Some typeof<obj>, hideObjectMethods = true, nonNullable = true, isErased = false)
do provider.DefineStaticParameters(parameters, buildTypes)
do this.AddNamespace(ns, [provider])
[<assembly:TypeProviderAssembly()>]
do ()
В другом проекте я хочу использовать предоставленный тип не напрямую, а наследуя его:
type Provided = MyNamespace.MyProvider<"Host123">
type Derived() =
inherit Provided() //Cannot inherit a sealed type
Однако я получаю сообщение об ошибке, в котором говорится, что предоставленный тип является запечатанным классом, поэтому он не может быть унаследован от.