gpt4 book ai didi

c# - 从 xsd 生成的代码中复数化属性

转载 作者:数据小太阳 更新时间:2023-10-29 02:13:46 29 4
gpt4 key购买 nike

我有一个 XSD 描述了我正在构建的应用程序中的一些数据契约的架构。我在编写 xsd 文件方面不是最有经验的,但到目前为止,我尝试过的任何方法都无法解决我的问题。

我有一部分架构看起来像这样:

<xs:complexType name="RecordSetDefinition">
<xs:sequence>
<xs:element name="RecordId" type="RecordIdDefinition" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="Record" type="RecordDefinition" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="Id" type="xs:string" />
</xs:complexType>

这对应的 XML 如下所示:

<RecordSet Id="Test">
<RecordId ...>
...
</RecordId>
<RecordId ...>
...
</RecordId>
<Record ...>
...
</Record>
<Record ...>
...
</Record>
<Record ...>
...
</Record>
</RecordSet>

我的想法是,我的 RecordSetDefinition 数据协定有一个 RecordIdDefinitionRecordDefinition 数组。运行生成命令:

xsd \c \l:cs

产生:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.1432")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="...")]
public partial class RecordSetDefinition {

private RecordIdDefinition[] recordIdField;

private RecordDefinition[] recordField;

private string idField;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("RecordId")]
public RecordIdDefinition[] RecordId {
get {
return this.recordIdField;
}
set {
this.recordIdField = value;
}
}

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Record")]
public RecordDefinition[] Record {
get {
return this.recordField;
}
set {
this.recordField = value;
}
}

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

这一切都很好而且花花公子......除了包含定义数组的属性的名称是单数,而不是复数。

问题:

为了帮助代码理解,我希望将这些名称复数化(即 RecordIds 而不是 RecordId)。这是否可以使用 XSD 来实现,以便 xsd.exe 将在 C# 中生成复数数组名称,同时仍保持 XML 中的单个元素名称?

XML 是任意的并且可以更改,但到目前为止,我似乎无法找到能够提供我想要的结果的架构排列。我得到的最接近的是制作一个名为 RecordIds 的元素,其中包含单独的 RecordId 记录,但这仍然导致相当不直观的 RecordIds.RecordId[] 属性。使用 xs:choice 会生成 RecordIds.Items[],这会起作用,但我想知道是否有更好的方法。

我不能只修改生成的代码,因为显然下次我们从 .xsd 生成 .cs 文件时它会被覆盖,这会带来可维护性问题对于下一位出现的开发人员。

最佳答案

我不确定 xsd.exe 是否可行

我认为最简单的解决方案是找到更好的名称。RecordIdList.RecordId[] 怎么样?

另一种方法是使用分部类。如果您能找到一种方法在分部类中获取您的 RecordIds,则您可以重新生成其余代码而无需更改它们。

您也可以尝试使用 xsd2code .它没有自动生成复数名称的能力,但由于它是开源的,您可以更改它来为您生成复数名称。

另一种解决方案是在生成代码后对其进行转换。编写一个脚本,在生成 .cs 文件后对其进行修改。

我的选择是。

  1. 找一个更好的名字
  2. 保持原样并可能在以下代码中添加注释为什么名称是单数的,以便下一个开发人员知道发生了什么。

关于c# - 从 xsd 生成的代码中复数化属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29616259/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com