我正在研究一个读取XSD文件的TypeProvider,并为XSD中定义的每种类型提供一种类型。但是我在下面的代码中遇到了问题
type schema = XmlProviders.Schema<"file.xsd">
type Bazzer = {
Sum : XmlProviders.bar
}
在最后一行我得到一个编译错误,说XmlProviders.bar不存在。 我如何定义类型的实现如下
let defineType (xType : XElement) =
let name = xType.Attribute(XName.Get "name").Value
let t = ProvidedTypeDefinition(thisAssembly,
ns,
name,
baseType = Some typeof<obj>)
let ctor = ProvidedConstructor(parameters = [ ],
InvokeCode= (fun args -> <@@ "" :> obj @@>))
t.AddMember ctor
do provider.DefineStaticParameters(parameters, fun tyName args ->
let filename = args.[0] :?> string
let main = ProvidedTypeDefinition(thisAssembly,ns,
tyName,
baseType = Some typeof<obj>)
//Elements is a list of XElement
elements |> List.map defineType |> ignore
main
我知道创建了XmlProviders.bar类型,因为如果我向defineType provider.AddMember t
添加一行,那么我会收到一条错误
类型提供程序'XmlProviders.SampleTypeProvider'报告错误:'XmlProviders.bar'的容器类型已设置为'XmlProviders.Schema'
XmlProviders.Schema
是由ProvidedTypeDefinition
provider
我有点迷失为什么编译器抱怨类型不在那里,而如果我明确地添加它我得到它已经存在的错误
答案 0 :(得分:4)
找到答案,以便那些以相同情况结束的人
行
let t = ProvidedTypeDefinition(thisAssembly,
ns,
name,
baseType = Some typeof<obj>)
其中定义嵌套类型应该没有程序集和命名空间
let t = ProvidedTypeDefinition(name,baseType = Some typeof<obj>)