2013-12-09 4 views
5

Я работаю над 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

Я немного потерял о том, почему компилятор жалуется, что тип не существует, а если я явно добавить его, я получаю сообщение об ошибке, что это уже есть

+0

похоже, вы знаете, уже в 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

ответ

4

нашел ответ, так те, которые заканчиваются в той же ситуации

линия

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

где вложенная тип определен должен быть без сборка и пространство имен

let t = ProvidedTypeDefinition(name,baseType = Some typeof<obj>) 
Смежные вопросы