【发布时间】:2016-02-18 17:06:23
【问题描述】:
如何对 DataMember 类中的属性进行排序? 我可以在顶层订购 DataMember,但不能订购子类中的属性。 例如:
我的服务合同
[ServiceContract]
public interface IService1
{
[OperationContract]
WcfResponse CallMe(WcfRequest request);
}
我的服务
public class Service1 : IService1
{
public WcfResponse CallMe(WcfRequest request)
{
return new WcfResponse();
}
}
我的 DataContract 类
[DataContract]
public class WcfRequest
{
[Required]
[DataMember]
public Header Header { get; set; }
[Required]
[DataMember]
public Footer Footer { get; set; }
}
[DataContract]
public class WcfResponse
{
[DataMember]
public string Status { get; set; }
[DataMember]
public string Errors { get; set; }
public WcfResponse()
{
Status = "FAILED";
Errors = null;
}
}
所以当我使用像 SoapUI 这样的工具时,我可以看到请求对象是按字母顺序序列化的(按照 WCF 默认):
<tem:request>
<edf:Footer>
<edf:IsComplete>?</edf:IsComplete>
<edf:Submitted>?</edf:Submitted>
</edf:Footer>
<edf:Header>
<edf:CompanyName>?</edf:CompanyName>
<edf:UserName>?</edf:UserName>
</edf:Header>
</tem:request>
如果我将 DataContract 更改为使用 Order 参数,我可以重新排序我的属性:
[DataContract]
public class WcfRequest
{
[Required]
[DataMember(Order = 0)]
public Header Header { get; set; }
[Required]
[DataMember(Order = 1)]
public Footer Footer { get; set; }
}
更新服务定义将给出:
<tem:request>
<edf:Header>
<edf:CompanyName>?</edf:CompanyName>
<edf:UserName>?</edf:UserName>
</edf:Header>
<edf:Footer>
<edf:IsComplete>?</edf:IsComplete>
<edf:Submitted>?</edf:Submitted>
</edf:Footer>
</tem:request>
正如我们所料。 我的问题是询问如何以相同的方式订购 Header & Footer 类的属性。 如果我尝试以下操作:
public class Header
{
[DataMember(Order = 3)]
public string UserName { get; set; }
[DataMember(Order = 2)]
public string CompanyName { get; set; }
}
public class Footer
{
[DataMember(Order = 5)]
public DateTime Submitted { get; set; }
[DataMember(Order = 6)]
public bool IsComplete { get; set; }
}
属性不会重新排序,仍然按字母顺序排列。
【问题讨论】:
-
您的页眉和页脚没有
DataContract属性。 -
克里基。写这个问题花了一段时间我很高兴这个简单的遗漏是原因。属性应用和问题排序。谢谢! @CodeCaster