防止svcutil生成“EmitDefaultValue = false”属性

时间:2011-07-22 18:15:29

标签: .net wcf web-services svcutil.exe

我最近一直在尝试使用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属性?

2 个答案:

答案 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"