我最近一直在尝试使用svcutil从xsd文件生成数据合同:
svcutil.exe /t:code /dconly /out:MyContract.cs /n:*,My.Namespace MyDataDefinition.xsd
XSD主要由以下定义组成:
<xsd:complexType name="SomeComplexObjectType">
<xsd:sequence>
<xsd:element name="FirstData" type="xsd:string" minOccurs="0" />
<xsd:element name="SecondData" type="xsd:string" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
svcutil生成如下内容:
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="SomeComplexObjectType")]
public partial class PersonInfo : object, System.Runtime.Serialization.IExtensibleDataObject
{
private string FirstDataField;
private string SecondDataField;
[System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false)]
public string FirstData
{
get
{
return this.FirstDataField;
}
set
{
this.FirstDataField= value;
}
}
[System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false)]
public string SecondData
{
get
{
return this.SecondDataField;
}
set
{
this.SecondDataField= value;
}
}
}
哪种方法正常,但是,“EmitDefaultValue = false”属性不是必需的。更不用说它在wsdl中引入了很多噪音,添加了这样的东西:
<xsd:element minOccurs="0" name="FirstData" nillable="true" type="xsd:string">
<xsd:annotation>
<xsd:appinfo>
<DefaultValue xmlns="http://schemas.microsoft.com/2003/10/Serialization/" EmitDefaultValue="false"/>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
目前我只是手工编辑生成的合同,但从维护的角度来看,这并不理想。
有谁知道如何防止svcutil自动生成这些EmitDefaultValue = false属性?
答案 0 :(得分:1)
请参阅this article。
在架构导入时,会自动设置EmitDefaultValue属性 每当前面提到的WCF特定注释时为false 检测。对于具有的引用类型,它也设置为false nillable属性设置为false以支持特定的互操作性 使用ASP.NET Web服务时经常出现的场景
看起来您唯一的选择是修改传入的架构,以便相关元素可以为空。
答案 1 :(得分:0)
记住SvcUtil只是一个工具。如果它不符合您的要求,请编写您自己的工具!
您可以使用PowerShell调用SvcUtil,并在自定义更改时编辑生成的文件。
一个简单的例子:
#Call SvcUtil
& svcutil #Whatever options you want go here
#Read the generated code
$thierCode = Get-Content "generatedFile.cs"
#Copy each line, editing as you go:
$myCode = @("//This file was generated using MySvcUtil.ps1")
foreach($line in $thierCode)
{
$myCode += $line.Replace("EmitDefaultValue=false", "")
}
#Write the edited code back into the .cs file.
$myCode | Set-Content "generatedFile.cs"