2013-12-09 7 views
5

Ich arbeite an einem TypeProvider, der eine XSD-Datei liest und einen Typ für jeden Typ in der XSD definiert. Jedoch habe ich ein Problem in dem unten stehenden Code habeKompilierung Fehler bei bereitgestellten Typ

type schema = XmlProviders.Schema<"file.xsd"> 
type Bazzer = { 
    Sum : XmlProviders.bar 
} 

in der letzten Zeile bekomme ich eine Kompilation Fehlermeldung, dass XmlProviders.bar existiert nicht. Die Umsetzung, wie ich die Typen definieren, sind wie folgt

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 

Ich weiß, dass ein XmlProviders.bar Typ da erstellt, wenn ich eine zusätzliche Zeile in den DefineType provider.AddMember t dann bekomme ich eine Fehlermeldung,

The type provider 'XmlProviders.SampleTypeProvider' reported an error: container type for 'XmlProviders.bar' was already set to 'XmlProviders.Schema'

Wo XmlProviders.Schema die ProvidedTypeDefinition von provider

identifiziert ist bin ich ein wenig verloren, warum der Compiler beschwert sich, dass die Art, während, wenn ich nicht da ist explizit fügt ich den Fehler, dass es schon da

ist
+0

es sieht aus wie Sie sich der workitem bereits GitHub sind, aber ich werde es hier hinzufügen, um anderen Menschen bewusst zu machen, Ihre Bemühungen [Support XSD in XmlPro Vider] (https://github.com/fsharp/FSharp.Data/issues/57) und nur für den Fall, dass ich meine diesbezügliche Frage verlinke (frei, diese zu entfernen, wenn ich zu intrudierend bin) [Wie man sich dem Schreiben nähert F # -Typ Provider, der komplexe Schema erzwingt?] (Http://stackoverflow.com/questions/20024418/how-to-approach-writing-an-f-type-provider-that-enforces-complex-schema). Mal sehen, ob ich hier behilflich bin (das heißt, ich bin eher Anfänger). – Veksi

Antwort

4

die Antwort gefunden, so zu denen, die in der gleichen Situation am Ende

die Linie

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

, wo der verschachtelte Typ definiert ist sein sollte, ohne Montage und Namespace

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