【问题标题】:C# generate class to namespaceC# 生成类到命名空间
【发布时间】:2018-11-07 09:13:27
【问题描述】:

我猜答案是否定的,但有没有办法将生成的类移动到不同的命名空间?

背景:

我有一个定义类的 XSD 文件,该类通过 xsd.exe 转换为 C# 类。默认情况下 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。 “Driver”类也在一个单独的文件中扩展,该文件存储在 SCM 中。

那么,有没有办法将类移动到没有

的自定义命名空间中
  1. 编辑生成的代码?
  2. 修改世代?
  3. 修改对 xsd.exe 的调用?

【问题讨论】:

  • “有没有办法将(部分)类移动到不同的命名空间?”不,一个类肯定属于一个命名空间。如果该类属于不同的命名空间,您将如何引用它?
  • 问题是,他能不能改变生成代码的命名空间。对于这个问题,部分内容令人困惑且不必要。
  • 您是否看到stackoverflow.com/questions/1843209/… 了解如何为生成的类指示命名空间?
  • @HimBromBeere - 这些“选项”之前基本上是“我做不到:”
  • 他们一直有“但是 .cs 文件的生成不在我的控制范围内”,我认为这已经意味着更改对 xsd 的调用是不可能的。就我而言,明确的编辑是对问题中已有内容的澄清

标签: c# xsd


【解决方案1】:

要更改生成类的命名空间,您需要将额外的parameter 传递给xsd.exe 调用:

/n[amespace]**:**namespace 为 生成的类型。默认命名空间是 Schemas。

重新生成类后,您还需要将该类的其他部分移动到新的命名空间。

【讨论】:

  • 抱歉,我忘记添加到列表中,对 xsd.exe 的调用不在我的控制范围内。
  • +1 我发布了几乎完全相同的内容,但您抢先一步 - 所以删除了我的帖子。我认为 OP 的问题措辞很糟糕
【解决方案2】:

好的,我想出了一个解决方案...

我只是从生成的类继承并在我自己的代码中使用 MyDriver 而不是 Driver:

namespace DriverXMLSerialization
{
    [System.Xml.Serialization.XmlRoot("Driver")]
    public class MyDriver : Driver
    {
        // foo
    }
}

【讨论】:

    猜你喜欢
    • 2012-11-14
    • 2010-12-23
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多