Я работаю над TypeProvider, который читает XSD-файл и предоставляет тип для каждого типа, определенного в 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
тогда я получаю сообщение об ошибке говорящего
The type provider 'XmlProviders.SampleTypeProvider' reported an error: container type for 'XmlProviders.bar' was already set to 'XmlProviders.Schema'
Где XmlProviders.Schema
является ProvidedTypeDefinition
идентифицируются provider
Я немного потерял о том, почему компилятор жалуется, что тип не существует, а если я явно добавить его, я получаю сообщение об ошибке, что это уже есть
похоже, вы знаете, уже в GitHub WorkItem, но я добавлю это здесь так, чтобы другие люди знали ваши усилия [Поддержка XSD в XmlPro vider] (https://github.com/fsharp/FSharp.Data/issues/57), и на всякий случай я перекрещиваю свой связанный с ним вопрос (не стесняйтесь удалять это, если я слишком вторгаюсь) [Как подойти к написанию F #, который применяет сложную схему?] (Http://stackoverflow.com/questions/20024418/how-to-approach-writing-an-f-type-provider-that-enforces-complex-schema). Давайте посмотрим, помогаю ли я здесь (то есть, я довольно новичок с этим). – Veksi