2013-12-09 30 views
5

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

+0

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

Odpowiedz

4

znalazłem odpowiedzi, więc do tych, które kończą się w tej samej sytuacji

linia

let t = ProvidedTypeDefinition(thisAssembly, 
            ns, 
            name, 
            baseType = Some typeof<obj>) 

gdzie zagnieżdżony typ jest określony powinien być bez montaż i nazw

let t = ProvidedTypeDefinition(name,baseType = Some typeof<obj>)