C # генерировать класс в пространство имен - PullRequest
0 голосов
/ 07 ноября 2018

Я предполагаю, что ответ - нет, но есть ли способ переместить сгенерированный класс в другое пространство имен?

Справочная информация:

У меня есть XSD-файл, который определяет класс, который превращается в класс C # с помощью xsd.exe. По умолчанию xsd.exe помещает класс в глобальное пространство имен:

XSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema
    elementFormDefault="qualified"
    xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:complexType name="Delays">
    <xs:sequence>
      <xs:element name="Delay" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:double">
              <xs:attribute name="function" type="xs:string"/>
            </xs:extension>            
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="Driver">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Delays" type="Delays" minOccurs="1" maxOccurs="1"/>
      </xs:sequence>
      <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
  </xs:element>

</xs:schema>

созданный класс:

//------------------------------------------------------------------------------
// <auto-generated>
//     Dieser Code wurde von einem Tool generiert.
//     Laufzeitversion:4.0.30319.42000
//
//     Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
//     der Code erneut generiert wird.
// </auto-generated>
//------------------------------------------------------------------------------

using System.Xml.Serialization;

// 
// Dieser Quellcode wurde automatisch generiert von xsd, Version=4.6.1055.0.
// 


/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class Driver {

    private DelaysDelay[] delaysField;

    private string nameField;

    /// <remarks/>
    [System.Xml.Serialization.XmlArrayItemAttribute("Delay", IsNullable=false)]
    public DelaysDelay[] Delays {
        get {
            return this.delaysField;
        }
        set {
            this.delaysField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class DelaysDelay {

    private string functionField;

    private double valueField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string function {
        get {
            return this.functionField;
        }
        set {
            this.functionField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlTextAttribute()]
    public double Value {
        get {
            return this.valueField;
        }
        set {
            this.valueField = value;
        }
    }
}

Я бы предпочел, чтобы класс находился в пользовательском пространстве имен. Однако создание файла .cs не в моем контроле. Редактирование сгенерированного файла .cs является плохой практикой, и файл .cs также не является частью SCM. Класс «Драйвер» также расширен в отдельном файле, который хранится в SCM.

Итак, есть ли способ переместить класс в пользовательское пространство имен без

  1. редактировать сгенерированный код?
  2. изменить поколение?
  3. изменить вызов xsd.exe?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Хорошо, я придумала решение ...

Я просто наследую от сгенерированного класса и использую MyDriver вместо Driver в своем собственном коде:

namespace DriverXMLSerialization
{
    [System.Xml.Serialization.XmlRoot("Driver")]
    public class MyDriver : Driver
    {
        // foo
    }
}
0 голосов
/ 07 ноября 2018

Чтобы изменить пространство имен сгенерированного класса, вам нужно передать дополнительный параметр в xsd.exe вызов:

/ n [amespace] **: ** namespace Указывает пространство имен времени выполнения для сгенерированные типы. Пространство имен по умолчанию - Схемы.

После регенерации классов вам необходимо переместить другие части этого класса в новое пространство имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...