2013-12-09 34 views
5

Bir XSD dosyası okuyan ve XSD'de tanımlanan her tür için bir tür sağlayan bir TypeProvider üzerinde çalışıyorum. Ben son satırında aşağıdaki koduSağlanan türde bir derleme hatası alma türü

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

bir sorun var ancak ben XmlProviders.bar var olmadığını söyleyen bir derleme hatası alıyorum. Bir XmlProviders.bar tip I

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

söyleyerek bir hata alıyorum sonra provider.AddMember t defineType bir satır daha eklemek çünkü eğer oluşturulduğunu biliyoruz

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 

şöyle Ben türlerini tanımlamak nasıl uygulanması vardır XmlProviders.Schemaprovider

tarafından tanımlanan ProvidedTypeDefinition olduğunu

Ben derleyici tipi olmadığını şikayet neden biraz kayıp olursam ederken açıkça ben orada aynı durumda sona olanlara böylece, cevap Bulunan

+0

zaten GitHub Workitem farkında gibi görünüyor, ama XmlPro da çabaları [Destek XSD diğer insanların haberdar etmek olarak bu yüzden buraya ekleyeceğim vider] (https://github.com/fsharp/FSharp.Data/issues/57) ve sadece konuyla ilgili bağlantıyı kesişirseniz (çok istekliysem bunu kaldırmaktan çekinmeyin) [Yazılıma nasıl yaklaşılır Karma şemayı uygulayan F # tipi sağlayıcı?] (Http://stackoverflow.com/questions/20024418/how-to-approach-writing-an-f-type-provider-that-enforces-complex-schema). Bakalım burada yardım edeyim (yani, bununla çaylak). – Veksi

cevap

4

zaten o hatayı alıyorum eklemek

iç içe tip olmadan olmalıdır tanımlanır hat

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

montaj ve ad

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