Pracuję nad dostawcą Type, który odczytuje plik XSD i dostarcza typ dla każdego typu zdefiniowanego w XSD. Jednak mam problem w kodzie poniżejUzyskiwanie błędu kompilacji dla podanego typu
type schema = XmlProviders.Schema<"file.xsd">
type Bazzer = {
Sum : XmlProviders.bar
}
w ostatnim wierszu pojawia się błąd kompilacji mówiąc, że XmlProviders.bar nie istnieje. Wdrożenie jak zdefiniować typy są następujące
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
wiem, że typ XmlProviders.bar jest tworzony ponieważ jeśli dodać dodatkową linię do defineType provider.AddMember t
następnie pojawia się błąd mówiący
The type provider 'XmlProviders.SampleTypeProvider' reported an error: container type for 'XmlProviders.bar' was already set to 'XmlProviders.Schema'
Gdzie XmlProviders.Schema
jest ProvidedTypeDefinition
zidentyfikowane przez provider
jestem trochę zagubiony, dlaczego kompilator narzeka, że typ nie ma natomiast jeśli jawnie dodać go pojawia się błąd, że już tam
wygląda na to, że są świadomi już workitem gitHub, ale będę je dodać tutaj, tak aby inni ludzie świadomi twoje wysiłki [Wsparcie XSD w XmlPro vider] (https://github.com/fsharp/FSharp.Data/issues/57) i na wypadek, gdyby skrzyżowałem link do mojego pokrewnego pytania (możesz je usunąć, jeśli zbytnio się wtrącam) [Jak podejść do pisania Dostawca F #, który wymusza skomplikowany schemat?] (Http://stackoverflow.com/questions/20024418/how-to-approach-writing-an-f-type-provider- thatfor-complex-schema). Zobaczmy, czy jestem tu z pomocą (to znaczy, jestem z tym nowicjuszem). – Veksi