且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持

更新时间:2022-09-10 17:07:59

通过第一部分的介绍,我们可以体会到,WCF Data ContractCLR TypeNeutral Contract之间搭建了一座桥梁,弥合了.NET世界和厂商中立世界的差异。通过WCF Data Contract我们将CLR Data Type暴露成一个厂商中立的数据结构的描述,同样通过WCF Data Contract我们将一个现有的CLR Data Type和既定的Neutral contract进行适配。

.NET中,基于Primary Type,比如Int32String等等,他们具有一个简单的默认的序列化方式和结构,可以说他们不需要Data Contract。接下来我们主要讨论的是一些相对比较特殊的、完全基于.NETData Type,比如GenericCollection,和Dictionary。首先,我们结合例子来谈谈基于GenericData TypeData Contract

假设我们需要创建一个用于处理一些单据(Bill)的Service,比如如Order BillSales Bill等。一般的单据都有一个单据头(Header)和明细(Detail)列表,为此我们创建了一个GenericBill。并

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持namespace Artech.SpecialDataContract.Contract
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [DataContract]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
public class Bill<THeader, TDetail>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [DataMember]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public THeader Header
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持getset; }
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [DataMember]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public IList<TDetail> DetailList
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持getset; }
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [DataContract]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
public class OrderHeader
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [DataMember]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public Guid OrderID
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持getset; }
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [DataMember]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public DateTime OrderDate
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持getset; }
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [DataContract]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
public class OrderDetail
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [DataMember]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public Guid ProductID
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持getset; }
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [DataMember]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public int Quantity
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持getset; }
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持}

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持

为处理订单单据创建了机遇订单的HeaderDetail

对于一个
Neutral Service ContractNeutral Data Contract本身是不可能支持Generic的,也就是Neutral Contract只能是对一个具体的CLR Type的体现。所以在定义Service Contract的时候,对于那些包含Generic Type作为参数或者返回值得Operation,我们必须指定一个具体的Data Type。所以我们创建了如下一个IBillManager Service Contract

 

 

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持namespace Artech.SpecialDataContract.Contract
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [ServiceContract]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
public interface IBillManager
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [OperationContract]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
void Procss(Bill<OrderHeader, OrderDetail> orderBill);
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持}

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持

如何我们现在

Host基于这样一个ContractService,你猜我们作为参数的数据类型将会如何体现的。

通过WSDL,我们会发现该ServiceData Contract将会以下面一段XSD的方式来呈现:

 

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持<?xml version="1.0" encoding="utf-8" ?>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
<xs:schema elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/Artech.SpecialDataContract.Contract"
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    xmlns:xs
="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.datacontract.org/2004/07/Artech.SpecialDataContract.Contract"
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    xmlns:ser
="http://schemas.microsoft.com/2003/10/Serialization/">
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持  
<xs:import schemaLocation="http://artech/Artech.SpecialDataContract/BillManagerService.svc?xsd=xsd1"
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持      namespace
="http://schemas.microsoft.com/2003/10/Serialization/" />
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持  
<xs:complexType name="BillOfOrderHeaderOrderDetailLZ9Dq20o">
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
<xs:annotation>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持      
<xs:appinfo>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
<GenericType Name="BillOf{0}{1}{#}" Namespace="http://schemas.datacontract.org/2004/07/Artech.SpecialDataContract.Contract"
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            xmlns
="http://schemas.microsoft.com/2003/10/Serialization/">
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持          
<GenericParameter Name="OrderHeader" Namespace="http://schemas.datacontract.org/2004/07/Artech.SpecialDataContract.Contract"/>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持          
<GenericParameter Name="OrderDetail" Namespace="http://schemas.datacontract.org/2004/07/Artech.SpecialDataContract.Contract"/>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
</GenericType>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持      
</xs:appinfo>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
</xs:annotation>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
<xs:sequence>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持      
<xs:element minOccurs="0" name="DetailList" nillable="true" type="tns:ArrayOfOrderDetail"/>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持      
<xs:element minOccurs="0" name="Header" nillable="true" type="tns:OrderHeader"/>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
</xs:sequence>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持  
</xs:complexType>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持  
<xs:element name="BillOfOrderHeaderOrderDetailLZ9Dq20o" nillable="true" type="tns:BillOfOrderHeaderOrderDetailLZ9Dq20o"/>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持  
<xs:complexType name="ArrayOfOrderDetail">
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
<xs:sequence>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持      
<xs:element minOccurs="0" maxOccurs="unbounded" name="OrderDetail" nillable="true" type="tns:OrderDetail"/>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
</xs:sequence>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持  
</xs:complexType>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持  
<xs:element name="ArrayOfOrderDetail" nillable="true" type="tns:ArrayOfOrderDetail"/>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持  
<xs:complexType name="OrderDetail">
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
<xs:sequence>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持      
<xs:element minOccurs="0" name="ProductID" type="ser:guid"/>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持      
<xs:element minOccurs="0" name="Quantity" type="xs:int"/>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
</xs:sequence>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持  
</xs:complexType>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持  
<xs:element name="OrderDetail" nillable="true" type="tns:OrderDetail"/>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持  
<xs:complexType name="OrderHeader">
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
<xs:sequence>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持      
<xs:element minOccurs="0" name="OrderDate" type="xs:dateTime"/>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持      
<xs:element minOccurs="0" name="OrderID" type="ser:guid"/>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
</xs:sequence>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持  
</xs:complexType>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持  
<xs:element name="OrderHeader" nillable="true" type="tns:OrderHeader"/>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
</xs:schema>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持

对于不习惯看XSD的朋友,我们可以通过Add Service Reference的方式创建本地的Proxy file,借助生成的与之对应的Class来看看这个XSD最终呈现的结构:

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [System.Diagnostics.DebuggerStepThroughAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [System.CodeDom.Compiler.GeneratedCodeAttribute(
"System.Runtime.Serialization""3.0.0.0")]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [System.Runtime.Serialization.DataContractAttribute(Name
="BillOfOrderHeaderOrderDetailLZ9Dq20o", Namespace="http://schemas.datacontract.org/2004/07/Artech.SpecialDataContract.Contract")]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [System.SerializableAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
public partial class BillOfOrderHeaderOrderDetailLZ9Dq20o : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [System.NonSerializedAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [System.Runtime.Serialization.OptionalFieldAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
private Artech.SpecialDataContract.Client.BillManagerService.OrderDetail[] DetailListField;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [System.Runtime.Serialization.OptionalFieldAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
private Artech.SpecialDataContract.Client.BillManagerService.OrderHeader HeaderField;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [global::System.ComponentModel.BrowsableAttribute(
false)]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public System.Runtime.Serialization.ExtensionDataObject ExtensionData 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
get 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                
return this.extensionDataField;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
set 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                
this.extensionDataField = value;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [System.Runtime.Serialization.DataMemberAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public Artech.SpecialDataContract.Client.BillManagerService.OrderDetail[] DetailList 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
get 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                
return this.DetailListField;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
set 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                
if ((object.ReferenceEquals(this.DetailListField, value) != true)) 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                    
this.DetailListField = value;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                    
this.RaisePropertyChanged("DetailList");
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [System.Runtime.Serialization.DataMemberAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public Artech.SpecialDataContract.Client.BillManagerService.OrderHeader Header 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
get 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                
return this.HeaderField;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
set 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                
if ((object.ReferenceEquals(this.HeaderField, value) != true)) 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                    
this.HeaderField = value;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                    
this.RaisePropertyChanged("Header");
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
protected void RaisePropertyChanged(string propertyName) 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            System.ComponentModel.PropertyChangedEventHandler propertyChanged 
= this.PropertyChanged;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
if ((propertyChanged != null)) 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                propertyChanged(
thisnew System.ComponentModel.PropertyChangedEventArgs(propertyName));
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [System.Diagnostics.DebuggerStepThroughAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [System.CodeDom.Compiler.GeneratedCodeAttribute(
"System.Runtime.Serialization""3.0.0.0")]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [System.Runtime.Serialization.DataContractAttribute(Name
="OrderHeader", Namespace="http://schemas.datacontract.org/2004/07/Artech.SpecialDataContract.Contract")]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [System.SerializableAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
public partial class OrderHeader : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [System.NonSerializedAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [System.Runtime.Serialization.OptionalFieldAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
private System.DateTime OrderDateField;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [System.Runtime.Serialization.OptionalFieldAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
private System.Guid OrderIDField;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [global::System.ComponentModel.BrowsableAttribute(
false)]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public System.Runtime.Serialization.ExtensionDataObject ExtensionData 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
get 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                
return this.extensionDataField;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
set 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                
this.extensionDataField = value;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [System.Runtime.Serialization.DataMemberAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public System.DateTime OrderDate 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
get 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                
return this.OrderDateField;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
set 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                
if ((this.OrderDateField.Equals(value) != true)) 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                    
this.OrderDateField = value;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                    
this.RaisePropertyChanged("OrderDate");
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [System.Runtime.Serialization.DataMemberAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public System.Guid OrderID 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
get 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                
return this.OrderIDField;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
set 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                
if ((this.OrderIDField.Equals(value) != true)) 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                    
this.OrderIDField = value;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                    
this.RaisePropertyChanged("OrderID");
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
protected void RaisePropertyChanged(string propertyName) 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            System.ComponentModel.PropertyChangedEventHandler propertyChanged 
= this.PropertyChanged;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
if ((propertyChanged != null)) 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                propertyChanged(
thisnew System.ComponentModel.PropertyChangedEventArgs(propertyName));
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [System.Diagnostics.DebuggerStepThroughAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [System.CodeDom.Compiler.GeneratedCodeAttribute(
"System.Runtime.Serialization""3.0.0.0")]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [System.Runtime.Serialization.DataContractAttribute(Name
="OrderDetail", Namespace="http://schemas.datacontract.org/2004/07/Artech.SpecialDataContract.Contract")]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [System.SerializableAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
public partial class OrderDetail : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [System.NonSerializedAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [System.Runtime.Serialization.OptionalFieldAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
private System.Guid ProductIDField;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [System.Runtime.Serialization.OptionalFieldAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
private int QuantityField;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [global::System.ComponentModel.BrowsableAttribute(
false)]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public System.Runtime.Serialization.ExtensionDataObject ExtensionData 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
get 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                
return this.extensionDataField;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
set 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                
this.extensionDataField = value;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [System.Runtime.Serialization.DataMemberAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public System.Guid ProductID 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
get 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                
return this.ProductIDField;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
set 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                
if ((this.ProductIDField.Equals(value) != true)) 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                    
this.ProductIDField = value;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                    
this.RaisePropertyChanged("ProductID");
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [System.Runtime.Serialization.DataMemberAttribute()]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public int Quantity 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
get 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                
return this.QuantityField;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
set 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                
if ((this.QuantityField.Equals(value) != true)) 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                    
this.QuantityField = value;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                    
this.RaisePropertyChanged("Quantity");
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
protected void RaisePropertyChanged(string propertyName) 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            System.ComponentModel.PropertyChangedEventHandler propertyChanged 
= this.PropertyChanged;
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            
if ((propertyChanged != null)) 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持                propertyChanged(
thisnew System.ComponentModel.PropertyChangedEventArgs(propertyName));
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持            }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持

为了使大家一眼就能了解整个结构,我对上面的代码进行简化:

 

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持namespace Artech.SpecialDataContract.Client.BillManagerService
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [DataContract]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
public class BillOfOrderHeaderOrderDetailLZ9Dq20o
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [DataMember]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public OrderHeader Header 
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持getset; }
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [DataMember]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public OrderDetail[] DetailList
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持getset; }
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [DataContract]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
public class OrderHeader
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [DataMember]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public Guid OrderID
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持getset; }
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [DataMember]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public DateTime OrderDate
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持getset; }
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [DataContract]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
public class OrderDetail
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [DataMember]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public Guid ProductID
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持getset; }
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [DataMember]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public int Quantity
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持getset; }
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持}

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持

我们可以通过上面的code,注意到下面的细节:

·         Generic class Bill<THeader, TDetail>没有了,取而代之的是使用了具体OrderHeaderOrderDetial的新的非Generic classBillOfOrderHeaderOrderDetailLZ9Dq20o。正如我们在上面所说,Neutral Contract根本就不知道Generic为何物。

·         新的Class name的名称很难看,它有下面几个部分组成:BillGeneric Type Name+ Of + OrderHeaderGeneric Type的第一个类型参数对应的具体类型名称)+OrderDetailGeneric Type的第二个类型参数对应的具体类型名称)+lLZ9Dq20oGeneric Type参数类型NamespaceHash Value)。

·         原本使用IList表示的DetailList变成了Arraypublic OrderDetail[] DetailList),这个将在和面的部分介绍。

我想你也不能容忍生成的如此冗长、甚至没有太大意义的Class name。我们有办法生成一个友好的名称。那就是显示指定Data ContractName

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持[DataContract(Name="OrderBill")]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
public class Bill<THeader, TDetail>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [DataMember]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public THeader Header
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持getset; }
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [DataMember]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public IList<TDetail> DetailList
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持getset; }
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持}

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持

现在对应的Data Contract Name将变成我们指定的名称。

public partial class OrderBill : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {}

但是上面的做法是不对的。原因很简单,如果我们在Service中添加一个处理Sales BillOperation(当然我们会添加两个额外的HeaderDetailSalesHeaderSalesDetail):

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [ServiceContract]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
public interface IBillManager
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [OperationContract(Name
=”ProcessOrderBill”)]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
void Procss(Bill<OrderHeader, OrderDetail> orderBill);
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [OperationContract(Name 
=”ProcessSalesBill”)]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
void Procss(Bill<SalesHeader, SalesDetail> salesBill);
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    }

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持

很显然,WCF需要为Order BillSales Bill创建两个Data Contract,但是现在你却把他们的名称显示地限定到一个固定的名称,很显然这会造成命名的冲突。如果你通过Browser试图访问Service,你会得到如下的Error

The server was unable to process the request due to an internal error. For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the <serviceDebug> configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework 3.0 SDK documentation and inspect the server trace logs.

所以WCF需要为此提供这样的机制:基于不同的泛型类型参数生成不同Data Contract Name,这样才能解决命名冲突。我们可以稍微修改一下Data Contract 的定义就可以了:

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    [DataContract(Name="Bill_{0}_{1}")]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
public class Bill<THeader, TDetail>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [DataMember]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public THeader Header
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持getset; }
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [DataMember]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public IList<TDetail> DetailList
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持getset; }
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持}

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持

其中{0}{1}分别代表第一个泛型类型参数和第二个泛型类型参数的名称,一次类推,你可以根据参数类型的个数设置{2}{3}…

这样我们生成的两个DataContract的名称为:Bill_OrderHeader_OrderDetailBill_SalesHeader_SalesDetail

但是这并没有根本解决问题,如果在我现在不同的Namespace中创建了两个OrderHeaderOrderDetail呢?这无疑在.NET中是合法的,但是对于DataContract有有可能出现命名冲突。

这也就是为什么WCF默认机制下会为Data Contract Name添加一个额外hash value的原因。其实你也可以以你自己的方式添加这个Hash value

 

 

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持[DataContract(Name="Bill_{0}_{1}_{#}")]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
public class Bill<THeader, TDetail>
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持    
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持{
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [DataMember]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public THeader Header
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持getset; }
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        [DataMember]
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
public IList<TDetail> DetailList
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持        
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持getset; }
艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持}

艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持

上面的

{#}就代表这样一个Hash Value, 我想你会想到现在生成的Data Contract Name象什么样子:Bill_OrderHeader_OrderDetail_LZ9Dq20o Bill_SalesHeader_SalesDetail_LZ9Dq20o