﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-Technological achievements dream</title><link>http://www.cnblogs.com/Henllyee/</link><description>技术成就梦想</description><language>zh-cn</language><lastBuildDate>Wed, 15 Oct 2008 23:07:30 GMT</lastBuildDate><pubDate>Wed, 15 Oct 2008 23:07:30 GMT</pubDate><ttl>60</ttl><item><title>程序员眼中的女人</title><link>http://www.cnblogs.com/Henllyee/archive/2008/10/08/1306134.html</link><dc:creator>Henllyee Cui</dc:creator><author>Henllyee Cui</author><pubDate>Wed, 08 Oct 2008 02:53:00 GMT</pubDate><guid>http://www.cnblogs.com/Henllyee/archive/2008/10/08/1306134.html</guid><wfw:comment>http://www.cnblogs.com/Henllyee/comments/1306134.html</wfw:comment><comments>http://www.cnblogs.com/Henllyee/archive/2008/10/08/1306134.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Henllyee/comments/commentRss/1306134.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Henllyee/services/trackbacks/1306134.html</trackback:ping><description><![CDATA[<p>有的女人就像Windows 虽然很优秀，但是安全隐患太大。<br />
有的女人就像UNIX&nbsp; 她条件很好，然而不是谁都能玩的起。<br />
有的女人就像C# 长的很漂亮，但是家务活不行。<br />
有的女人就像C++,她会默默的为你做很多的事情。 <br />
有的女人就像JAVA,只需一点付出她就会为你到处服务。 <br />
有的女人就像，虽然对她处处小心但最终还是没有结果。 <br />
有的女人就像汇编 虽然很麻烦，但是有的时候还得求它。 <br />
有的女人就像 SQL，她会为你的发展带来莫大的帮助。 <br />
爱情就是死循环，一旦执行就陷进去了。 <br />
爱上一个人，就是内存泄露，你永远释放不了。 <br />
真正爱上一个人的时候，那就是常量限定，永远不会改变。 <br />
女朋友就是私有变量，只有我这个类才能调用。 </p>
<p>情人就是指针,用的时候一定要注意，要不然就带来巨大的灾难</p>
<img src ="http://www.cnblogs.com/Henllyee/aggbug/1306134.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43012/" target="_blank">[新闻]最富有科技公司：中移动310亿美元居首</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>WCF学习（五）数据契约之已知类型</title><link>http://www.cnblogs.com/Henllyee/archive/2008/08/26/1276995.html</link><dc:creator>Henllyee Cui</dc:creator><author>Henllyee Cui</author><pubDate>Tue, 26 Aug 2008 12:19:00 GMT</pubDate><guid>http://www.cnblogs.com/Henllyee/archive/2008/08/26/1276995.html</guid><wfw:comment>http://www.cnblogs.com/Henllyee/comments/1276995.html</wfw:comment><comments>http://www.cnblogs.com/Henllyee/archive/2008/08/26/1276995.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/Henllyee/comments/commentRss/1276995.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Henllyee/services/trackbacks/1276995.html</trackback:ping><description><![CDATA[<p>准备技术：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.C#基础知识</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.了解WCF基础知识</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在正常的c#开发中我们是允许用子类去替换基类的，这也是所谓的替换原则。但是我们在WCF中确不能用数据契约的子类来替换父类的，因为这中间存在一个序列化的问题。举个例子：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们有数据契约：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DataContract]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class Employee{...}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;服务契约中：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ServiceContract]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interface IEmployeeManager</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[OperationContract]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void AddEmployee(Employee employee);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;然后我们在客户端的代理中就算有类：Intern继承于</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DataContract]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class Intern:Employee{...}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;然后再客户端调用时：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy.AddEmployee(new Intern())是会出错的。因为在服务器端无法识别Intern对象，因为他无法去反序列化Intern成Employee对象(<a href="http://www.cnblogs.com/Henllyee/archive/2008/08/05/1261107.html">WCF序列化</a>)。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WCF提供给我们了一个解决的办法就是使用KnownTypeAttribute特性，在基类上标识对应的子类就可以了。KnownTypeAttribute特性可以使用在Struct跟Class上。示例：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DataContract]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[KnownType(typeof(Customer))]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class Employee{...}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DataContract]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class Intern:Employee{...}</p>
<p>这样我们就在所有的契约跟操作上，能跨越所有的服务和终结点，允许服务接受子类。但是这样会遇到一个问题，我们不能去特定的指定某一个服务操作，所以KnownType的缺陷就是范围过于广泛。WCF提供了另外一个Attribute--ServiceKnownType.</p>
<p>&nbsp;</p>
<p><strong>ServiceKnownType </strong>特性</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KnownType只能应用在数据契约的基类上，而ServiceKnownType可以在Interface、Method、Class上标识。看一个示例Employee.cs：</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_200534" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_200534').style.display='none'; document.getElementById('Code_Open_Image_200534').style.display='inline'; document.getElementById('Code_Open_Text_200534').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_200534" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_200534').style.display='none'; getElementById('Code_Closed_Image_200534').style.display='inline'; getElementById('Code_Closed_Text_200534').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_200534">Code</span><span id="Code_Open_Text_200534" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Linq;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Text;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.ServiceModel;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Runtime.Serialization;<br />
<br />
</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;HenllyeeDataContract<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;[DataContract]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Employee<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;Fields</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;_name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;Properties</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;The&nbsp;employee's&nbsp;name<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #808080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DataMember(Order</span><span style="color: #000000">=</span><span style="color: #800080">0</span><span style="color: #000000">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;Name<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;The&nbsp;employee's&nbsp;age<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #808080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DataMember(Order</span><span style="color: #000000">=</span><span style="color: #800080">1</span><span style="color: #000000">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Age<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;[DataContract]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Intern&nbsp;:&nbsp;Employee<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_internship;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;The&nbsp;intern's&nbsp;working&nbsp;days<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #808080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DataMember]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Internship<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._internship;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._internship&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></span></div>
<p>&nbsp;</p>
<p>在数据契约中我们并没有去指定KnownType，我们在服务契约的操作上去标识ServiceKnownType特性，EmployeeManage.cs:</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_104136" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_104136').style.display='none'; document.getElementById('Code_Open_Image_104136').style.display='inline'; document.getElementById('Code_Open_Text_104136').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_104136" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_104136').style.display='none'; getElementById('Code_Closed_Image_104136').style.display='inline'; getElementById('Code_Closed_Text_104136').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_104136">Code</span><span id="Code_Open_Text_104136" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Linq;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Text;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.ServiceModel;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Runtime.Serialization;<br />
<br />
</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;HenllyeeServiceContract<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;[ServiceContract]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;IEmployeeManage<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[OperationContract]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ServiceKnownType(</span><span style="color: #0000ff">typeof</span><span style="color: #000000">(HenllyeeDataContract.Intern))]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;AddEmployee(HenllyeeDataContract.Employee&nbsp;emlpoyee);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[OperationContract]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ServiceKnownType(</span><span style="color: #0000ff">typeof</span><span style="color: #000000">(HenllyeeDataContract.Intern))]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HenllyeeDataContract.Employee&nbsp;GetEmployee();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;[ServiceBehavior(InstanceContextMode</span><span style="color: #000000">=</span><span style="color: #000000">InstanceContextMode.Single)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;EmployeeManage&nbsp;:&nbsp;IEmployeeManage<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;HenllyeeDataContract.Employee&nbsp;_employee;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;Set&nbsp;employee<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="emlpoyee"&gt;</span><span style="color: #008000">the&nbsp;employee's&nbsp;object</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #808080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;AddEmployee(HenllyeeDataContract.Employee&nbsp;emlpoyee)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._employee&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;emlpoyee;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;Get&nbsp;a&nbsp;employee<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #808080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;HenllyeeDataContract.Employee&nbsp;GetEmployee()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._employee;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></span></div>
<p>&nbsp;</p>
<p>在客户端我们调用：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_104245" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_104245').style.display='none'; document.getElementById('Code_Open_Image_104245').style.display='inline'; document.getElementById('Code_Open_Text_104245').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_104245" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_104245').style.display='none'; getElementById('Code_Closed_Image_104245').style.display='inline'; getElementById('Code_Closed_Text_104245').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_104245">Code</span><span id="Code_Open_Text_104245" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Linq;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Text;<br />
<br />
</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;Client<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Program<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Main(</span><span style="color: #0000ff">string</span><span style="color: #000000">[]&nbsp;args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EmployeeService.EmployeeManageClient&nbsp;proxy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Client.EmployeeService.EmployeeManageClient();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EmployeeService.Intern&nbsp;intern&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Client.EmployeeService.Intern();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intern.Age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">22</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intern.Name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Henllyee&nbsp;Cui</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intern.Internship&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">120</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy.AddEmployee(intern);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EmployeeService.Employee&nbsp;internOut&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;proxy.GetEmployee();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(</span><span style="color: #800000">"</span><span style="color: #800000">The&nbsp;Employee&nbsp;Name:{0}\nAge:{1}\n</span><span style="color: #800000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;internOut.Name,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;internOut.Age<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Read();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></span></div>
<p>运行后：&nbsp;</p>
<p><img height="431" alt="" src="http://www.cnblogs.com/images/cnblogs_com/henllyee/run.JPG" width="668" border="0" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServiceKnownType特性也可以表示在数据契约的类上，那么就会应用到整个数据契约中操作上，如：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ServiceContract]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ServiceDataContract(typeof(HenllyeeDataContract.Intern))]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;IEmployeeManage</span>{...}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;那么IEmployeeManage服务契约跟其所有的操作都可以接受Intern这个子类.</p>
<p><strong>已知类型与接口</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据契约DataContract只能标识在class 或者struct上，但是数据契约的基类可以是接口,但是我们在服务契约的时候要去用ServiceKnownType特性去指定确切的数据类型。如:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interface IEmployee{...}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DataContract]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class Intern:IEmployee{...}</p>
<p>服务契约中：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ServiceContract]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>[ServiceKnownType(typeof(Intern))]</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interface IEmployeeManage</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[OperationContract]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void AdddEmployee(IEmployee employee);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>要注意的一点就是我们不能把KnownType特性应用到基接口上，因为客服端导出的元数据是不能包含接口本身的。</p>
<p><a href="http://files.cnblogs.com/Henllyee/KownType.rar">[代码下载]</a></p><img src ="http://www.cnblogs.com/Henllyee/aggbug/1276995.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43010/" target="_blank">[新闻]华盛顿抛弃微软Office 选择Google Apps</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>WCF学习 （四）  数据契约的事件</title><link>http://www.cnblogs.com/Henllyee/archive/2008/08/05/1261107.html</link><dc:creator>Henllyee Cui</dc:creator><author>Henllyee Cui</author><pubDate>Tue, 05 Aug 2008 08:35:00 GMT</pubDate><guid>http://www.cnblogs.com/Henllyee/archive/2008/08/05/1261107.html</guid><wfw:comment>http://www.cnblogs.com/Henllyee/comments/1261107.html</wfw:comment><comments>http://www.cnblogs.com/Henllyee/archive/2008/08/05/1261107.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/Henllyee/comments/commentRss/1261107.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Henllyee/services/trackbacks/1261107.html</trackback:ping><description><![CDATA[<p><strong>技术准备：</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.dotnet基本开发；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.WCF的数据契约跟服务契约的基本使用</p>
<p><strong>内容：</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们都知道数据契约其实也是服务器端到客户端序列化跟反序列化，这样的序列化跟asp.net ajax访问webservice是很像的.asp.net ajax 一般是将服务器端的数据序列化成jason字符串传递给前台脚本的但是我们在序列化或则反序列化的时候也许会要去控制一些数据契约里面的Filed或则Attributes,这就需要我们去监听数据契约在序列化及反序列化时触发的一些事件。</p>
<p>&nbsp;</p>
<p><strong>数据契约的事件</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据契约在序列化跟反序列化分别有四个事件：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.serializing事件：发生在序列化之前；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.serialized事件：发生在序列化之后；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.deserializing事件：反序列化之前；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.deserialized事件：反序列化之后；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;四个事件我们一眼就能看得懂。但是我们如何去监听这几个事件呢，WCF提供了四个属性标识来标识我们定义的某个方法是来监听标识的特定的事件。但是我们在定义方法的时候必须要去符合这些事件的委托的类型，也就是说必须有相同的参数。我们看下定义的形式：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.监听serializing事件：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[OnSerializing]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void OnSerializing(StreamingContext context)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.监听serialized事件：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[OnSerialized]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void OnSerialized(StreamingContext context)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.监听deserializing事件：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[OnDeserializing]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void OnDeserializing(StreamingContext context)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.监听deserialized事件：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[OnDeserialized]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void OnDeserialized(StreamingContext context)</p>
<p>所以我们可以看出我们定义的方法一定要符合 void &lt;methdName&gt;(StringmingContext &lt;Pram&gt;)的形式，不然WCF就会抛出异常。要注意的一点就是：我们不能把相同的事件的标识应用到多个方法上面。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因为在反序列化的时候是没有构造函数被调用的，所以我们可以通过OnDeserializing来实现反序列化的构造函数的功能。OnDeserialized事件允许初始化数据契约或则非数据契约的成员。下面我们就看一个例子通过监听OnDeserialized来设置非数据成员的值。</p>
<p>首先我们来定义一个数据契约：</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_162259" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_162259').style.display='none'; document.getElementById('Code_Open_Image_162259').style.display='inline'; document.getElementById('Code_Open_Text_162259').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_162259" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_162259').style.display='none'; getElementById('Code_Closed_Image_162259').style.display='inline'; getElementById('Code_Closed_Text_162259').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_162259">Code</span><span id="Code_Open_Text_162259" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Linq;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Text;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.ServiceModel;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Runtime.Serialization;<br />
<br />
</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;DataContract<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;[DataContract(Name</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">Employee</span><span style="color: #800000">"</span><span style="color: #000000">,Namespace</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">HenllyeeData</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;EmployeeEntry<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;Fields</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;_companyName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;_name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">decimal</span><span style="color: #000000">&nbsp;_salary;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;Attributes</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DataMember(IsRequired</span><span style="color: #000000">=</span><span style="color: #0000ff">false</span><span style="color: #000000">,Order</span><span style="color: #000000">=</span><span style="color: #800080">0</span><span style="color: #000000">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;Name<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._name;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;value;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DataMember(IsRequired</span><span style="color: #000000">=</span><span style="color: #0000ff">false</span><span style="color: #000000">,Order</span><span style="color: #000000">=</span><span style="color: #800080">1</span><span style="color: #000000">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Age<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._age;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;value;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DataMember(IsRequired</span><span style="color: #000000">=</span><span style="color: #0000ff">false</span><span style="color: #000000">,Order</span><span style="color: #000000">=</span><span style="color: #800080">2</span><span style="color: #000000">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">decimal</span><span style="color: #000000">&nbsp;Salary<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._salary;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._salary&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;value;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DataMember(IsRequired</span><span style="color: #000000">=</span><span style="color: #0000ff">false</span><span style="color: #000000">,Order</span><span style="color: #000000">=</span><span style="color: #800080">3</span><span style="color: #000000">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;Info<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;String.Format(</span><span style="color: #800000">"</span><span style="color: #800000">Name:{0}&nbsp;\n&nbsp;Age:{1}&nbsp;\n;&nbsp;Salary:{2}\n&nbsp;CompanyName:{3}\n</span><span style="color: #800000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._name,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._age,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._salary,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._companyName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[OnDeserialized]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;OnDeserialized(StreamingContext&nbsp;context)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._companyName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">ECI</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></span></div>
<p>&nbsp;</p>
<p>在这里面我们定义了一个<font face="Verdana">_companyName</font>字段，并且不表示为DataMember,但是在Info属性中去获取了<font face="Verdana">_companyName</font>的值。我们在反序列化的时候完后通过OnDeserizlized方法中设计了其值。</p>
<p>&nbsp;</p>
<p>下面是服务契约：</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_162718" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_162718').style.display='none'; document.getElementById('Code_Open_Image_162718').style.display='inline'; document.getElementById('Code_Open_Text_162718').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_162718" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_162718').style.display='none'; getElementById('Code_Closed_Image_162718').style.display='inline'; getElementById('Code_Closed_Text_162718').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_162718">Code</span><span id="Code_Open_Text_162718" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Linq;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Text;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.ServiceModel;<br />
<br />
</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;ServiceContract<br />
{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;[ServiceContract(Name</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">EmployeeManagerService</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;IEmployeeManager<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;Get&nbsp;a&nbsp;employee&nbsp;object<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #808080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[OperationContract(Name</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">GetEmployee</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataContract.EmployeeEntry&nbsp;GetEmployee();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;Save&nbsp;a&nbsp;employee&nbsp;object<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="?"&gt;&lt;/param&gt;</span><span style="color: #808080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[OperationContract(Name</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">SaveEmployee</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;SaveEmplyee(DataContract.EmployeeEntry&nbsp;employee);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></span></div>
<p>&nbsp;</p>
<p>服务契约的实现：</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_162800" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_162800').style.display='none'; document.getElementById('Code_Open_Image_162800').style.display='inline'; document.getElementById('Code_Open_Text_162800').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_162800" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_162800').style.display='none'; getElementById('Code_Closed_Image_162800').style.display='inline'; getElementById('Code_Closed_Text_162800').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_162800">Code</span><span id="Code_Open_Text_162800" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Linq;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Text;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.ServiceModel;<br />
<br />
</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;ServiceContract<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;[ServiceBehavior(InstanceContextMode</span><span style="color: #000000">=</span><span style="color: #000000">InstanceContextMode.Single)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;EmployeeManager:IEmployeeManager<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;Fields</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;DataContract.EmployeeEntry&nbsp;_employee;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;Methods</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;DataContract.EmployeeEntry&nbsp;GetEmployee()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._employee;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;SaveEmplyee(DataContract.EmployeeEntry&nbsp;EmloyeeEntry)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">._employee&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;EmloyeeEntry;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></span></div>
<p>&nbsp;</p>
<p>宿主主机的代码比较简单就是暴露了一个终节点给客户端。</p>
<p>我们看下客户端的代码：</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_163012" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_163012').style.display='none'; document.getElementById('Code_Open_Image_163012').style.display='inline'; document.getElementById('Code_Open_Text_163012').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_163012" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_163012').style.display='none'; getElementById('Code_Closed_Image_163012').style.display='inline'; getElementById('Code_Closed_Text_163012').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_163012">Code</span><span id="Code_Open_Text_163012" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Linq;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Text;<br />
<br />
</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;ConsoleApplication1<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Program<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Main(</span><span style="color: #0000ff">string</span><span style="color: #000000">[]&nbsp;args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EmployeeServiceReference.Employee&nbsp;emloyee&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConsoleApplication1.EmployeeServiceReference.Employee();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;emloyee.Name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Henllyee</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;emloyee.Age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">22</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;emloyee.Salary&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">3000</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EmployeeServiceReference.EmployeeManagerServiceClient&nbsp;proxy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConsoleApplication1.EmployeeServiceReference.EmployeeManagerServiceClient();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy.SaveEmployee(emloyee);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EmployeeServiceReference.Employee&nbsp;emploOut</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;proxy.GetEmployee();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Write(emploOut.Info);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Read();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></span></div>
<p>&nbsp;</p>
<p>&nbsp;运行主机跟客户端后我们看到了想要的效果：</p>
<p><img height="438" alt="" src="http://www.cnblogs.com/images/cnblogs_com/henllyee/wcfEvent.JPG" width="669" border="0" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><a href=http://files.cnblogs.com/Henllyee/DataEvent.rar><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt">[代码下载]</span></span></span></a>&nbsp;</p>  <img src ="http://www.cnblogs.com/Henllyee/aggbug/1261107.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43009/" target="_blank">[新闻]微软：WGA验证每小时黑屏是善意提醒</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>个人的一点私事</title><link>http://www.cnblogs.com/Henllyee/archive/2008/08/05/1260755.html</link><dc:creator>Henllyee Cui</dc:creator><author>Henllyee Cui</author><pubDate>Tue, 05 Aug 2008 03:12:00 GMT</pubDate><guid>http://www.cnblogs.com/Henllyee/archive/2008/08/05/1260755.html</guid><wfw:comment>http://www.cnblogs.com/Henllyee/comments/1260755.html</wfw:comment><comments>http://www.cnblogs.com/Henllyee/archive/2008/08/05/1260755.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/Henllyee/comments/commentRss/1260755.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Henllyee/services/trackbacks/1260755.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;到新公司上班已经一个多月了，处了不少技术朋友。感觉自己所在的项目组的人技术水平都是蛮不错的，同时找到了能跟自己一起研究&#8220;asp.net 控件开发&#8221;的人。好久没有找到一个能经常跟自己讨论技术上东西的朋友了，已经半年了，现在很开心。在工作上很开心，没有了那以前的疯狂加班（经常到三点），有了更多的时间去研究自己以前一直放着没时间研究的东西；工作之余，喜欢跟客服的几个人一起玩，自己也不知道为什么，总是在他们那边找到大学宿舍的氛围。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现在突然发现自己改变了不少，少了往日的几分轻狂，更多的了沉默，也许是没有了激情。想想以前在学校的时候能够借助老师给的机会，给全班讲授了两节课的自己研究的东西，而且底下的人听了感觉非常好；想想以前能有在课上站起来跟老师辩论asp.net的好处。以前那个充满激情、那个似乎研究出东西就要让全世界知道、那个莽撞的我也许就此消失了。可是当我第一次看到我们的系统的时候，我第一感觉就是，可以用进很多新技术啊，可以改进很多很多，后来还是沉默了，也许就是自己变了。去年的时候自己跟另外一个朋友做网站时，尽管我们经理说只要符合IE，可是我们还是坚决做到浏览器兼容、前台脚本符合w3c标准；做系统时尽量做到能用ajax取代一些不必要的刷新，做到多层结构；可是现在不知道为什么连这样的想法多没了，有的时候竟然自己也在复制些大写Tag。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现在最多就是写点文章放在blog上，有的时候竟然连东西都懒得写了。前几天去跟同学去苏州乐园玩的，他问我多长时间没踢球了，我算了一下，好像好几个月了。自己真的变懒了，生活上是，工作上也是。自己晚上还在研究些东西、只是激情不再。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<img src ="http://www.cnblogs.com/Henllyee/aggbug/1260755.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43009/" target="_blank">[新闻]微软：WGA验证每小时黑屏是善意提醒</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Asp.net 控件开发（四）  数据回传</title><link>http://www.cnblogs.com/Henllyee/archive/2008/07/25/1251502.html</link><dc:creator>Henllyee Cui</dc:creator><author>Henllyee Cui</author><pubDate>Fri, 25 Jul 2008 08:57:00 GMT</pubDate><guid>http://www.cnblogs.com/Henllyee/archive/2008/07/25/1251502.html</guid><wfw:comment>http://www.cnblogs.com/Henllyee/comments/1251502.html</wfw:comment><comments>http://www.cnblogs.com/Henllyee/archive/2008/07/25/1251502.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cnblogs.com/Henllyee/comments/commentRss/1251502.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Henllyee/services/trackbacks/1251502.html</trackback:ping><description><![CDATA[摘要: 准备技术：1. Asp.net常规开发技术；2.了解控件开发的呈现、属性状态简单原理。内容：数据回传就是说客户端将数据回交给服务器，然后asp.net模型将会将处理后的数据回传到表单中去。如果开发的控件需要回传的话，就必须要去继承于IPostBackDataHandler接口。继承IPostBackDataHandler之后我们一般需要去重写两个方法：1.LoadPostData().方法返回一个&nbsp;&nbsp;<a href='http://www.cnblogs.com/Henllyee/archive/2008/07/25/1251502.html'>阅读全文</a><img src ="http://www.cnblogs.com/Henllyee/aggbug/1251502.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43008/" target="_blank">[新闻]研究表明上网可以提高记忆力</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Asp.net Ajax WebService 实现循环引用(自定义JavascriptConverter)</title><link>http://www.cnblogs.com/Henllyee/archive/2008/07/18/1246161.html</link><dc:creator>Henllyee Cui</dc:creator><author>Henllyee Cui</author><pubDate>Fri, 18 Jul 2008 07:49:00 GMT</pubDate><guid>http://www.cnblogs.com/Henllyee/archive/2008/07/18/1246161.html</guid><wfw:comment>http://www.cnblogs.com/Henllyee/comments/1246161.html</wfw:comment><comments>http://www.cnblogs.com/Henllyee/archive/2008/07/18/1246161.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/Henllyee/comments/commentRss/1246161.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Henllyee/services/trackbacks/1246161.html</trackback:ping><description><![CDATA[摘要: 准备技术：1.简单的WebService编写；2.了解Asp.net Ajax 客户端访问WebService内容：asp.net ajax框架在去年看过，只是些基本的使用，并没有过多的去研究它的原理。最近在一个项目中要实现客户端访问WebService并返回DataTable类型的数据，当我调用一个返回DataTable的方法时，不能返回成功，在错误的回调函数中告诉我DataTable是一个循环&nbsp;&nbsp;<a href='http://www.cnblogs.com/Henllyee/archive/2008/07/18/1246161.html'>阅读全文</a><img src ="http://www.cnblogs.com/Henllyee/aggbug/1246161.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43007/" target="_blank">[新闻]为什么叫Windows 7？</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>WCF学习(三)-------数据契约1</title><link>http://www.cnblogs.com/Henllyee/archive/2008/07/03/1234584.html</link><dc:creator>Henllyee Cui</dc:creator><author>Henllyee Cui</author><pubDate>Thu, 03 Jul 2008 03:00:00 GMT</pubDate><guid>http://www.cnblogs.com/Henllyee/archive/2008/07/03/1234584.html</guid><wfw:comment>http://www.cnblogs.com/Henllyee/comments/1234584.html</wfw:comment><comments>http://www.cnblogs.com/Henllyee/archive/2008/07/03/1234584.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cnblogs.com/Henllyee/comments/commentRss/1234584.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Henllyee/services/trackbacks/1234584.html</trackback:ping><description><![CDATA[摘要: WCF能够托管CLR类型，客户端能传递和处理CLR类型的数据（如：string和int），但是如果我们自己定义的类型（如：声明的Customer类）。其实WCF的传递CLR自己类型时，是因为已经把它序列化成了xml信息集，而我们自己定义的类型则需要自己去显示的声明序列化。序列化.net的序列化。.net是通过反射机制（反射机制参考文档）自动实现对象的序列化与反序列化。首先.net能够捕获对象每个字&nbsp;&nbsp;<a href='http://www.cnblogs.com/Henllyee/archive/2008/07/03/1234584.html'>阅读全文</a><img src ="http://www.cnblogs.com/Henllyee/aggbug/1234584.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43003/" target="_blank">[新闻]Open Source Camp 北京 2008技术交流盛会</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>简单工厂</title><link>http://www.cnblogs.com/Henllyee/archive/2008/07/01/1233318.html</link><dc:creator>Henllyee Cui</dc:creator><author>Henllyee Cui</author><pubDate>Tue, 01 Jul 2008 08:16:00 GMT</pubDate><guid>http://www.cnblogs.com/Henllyee/archive/2008/07/01/1233318.html</guid><wfw:comment>http://www.cnblogs.com/Henllyee/comments/1233318.html</wfw:comment><comments>http://www.cnblogs.com/Henllyee/archive/2008/07/01/1233318.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/Henllyee/comments/commentRss/1233318.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Henllyee/services/trackbacks/1233318.html</trackback:ping><description><![CDATA[摘要: 简单的工厂我的理解就是根据具体的情况，返回一个类型的具体类。一般时简单的工厂由：工厂、抽象产品、具体产品组成：1.抽象产品：定义了具体产品公共的特性。可以是一个abstract calss 或者一个 interface；2.具体产品：定义了工厂Create出来的具体产品。一般是一个具体实现的类继承与抽象产品；3.工 厂：客户端调用，用来根据不同的情况产生不同的产品。看一个现实中的例子：在一般的软件&nbsp;&nbsp;<a href='http://www.cnblogs.com/Henllyee/archive/2008/07/01/1233318.html'>阅读全文</a><img src ="http://www.cnblogs.com/Henllyee/aggbug/1233318.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43002/" target="_blank">[新闻]关于 Silverlight 2 Control Tookit 的最新消息</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>C# 反射机制（转）</title><link>http://www.cnblogs.com/Henllyee/archive/2008/07/01/1233246.html</link><dc:creator>Henllyee Cui</dc:creator><author>Henllyee Cui</author><pubDate>Tue, 01 Jul 2008 07:33:00 GMT</pubDate><guid>http://www.cnblogs.com/Henllyee/archive/2008/07/01/1233246.html</guid><wfw:comment>http://www.cnblogs.com/Henllyee/comments/1233246.html</wfw:comment><comments>http://www.cnblogs.com/Henllyee/archive/2008/07/01/1233246.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Henllyee/comments/commentRss/1233246.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Henllyee/services/trackbacks/1233246.html</trackback:ping><description><![CDATA[<p align="left"><span class="Code"><font color="#000000">1、 什么是反射<br />
2、 命名空间与装配件的关系<br />
3、 运行期得到类型信息有什么用<br />
4、 如何使用反射获取类型<br />
5、 如何根据类型来动态创建对象<br />
6、 如何获取方法以及动态调用方法<br />
7、 动态创建委托</font></span></p>
<p>&nbsp;1、什么是反射<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reflection，中文翻译为反射。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是.Net中获取运行时类型信息的方式，.Net的应用程序由几个部分：&#8216;程序集(Assembly)&#8217;、&#8216;模块(Module)&#8217;、&#8216;类型(class)&#8217;组成，而反射提供一种编程的方式，让程序员可以在程序运行期获得这几个组成部分的相关信息，例如：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assembly类可以获得正在运行的装配件信息，也可以动态的加载装配件，以及在装配件中查找类型信息，并创建该类型的实例。<br />
Type类可以获得对象的类型信息，此信息包含对象的所有要素：方法、构造器、属性等等，通过Type类可以得到这些要素的信息，并且调用之。<br />
MethodInfo包含方法的信息，通过这个类可以得到方法的名称、参数、返回值等，并且可以调用之。<br />
诸如此类，还有FieldInfo、EventInfo等等，这些类都包含在System.Reflection命名空间下。</p>
<p>2、命名空间与装配件的关系<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 很多人对这个概念可能还是很不清晰，对于合格的.Net程序员，有必要对这点进行澄清。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 命名空间类似与Java的包，但又不完全等同，因为Java的包必须按照目录结构来放置，命名空间则不需要。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 装配件是.Net应用程序执行的最小单位，编译出来的.dll、.exe都是装配件。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 装配件和命名空间的关系不是一一对应，也不互相包含，一个装配件里面可以有多个命名空间，一个命名空间也可以在多个装配件中存在，这样说可能有点模糊，举个例子：<br />
装配件A：<br />
namespace&nbsp;&nbsp; N1<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;&nbsp; class&nbsp;&nbsp; AC1&nbsp;&nbsp; {&#8230;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;&nbsp; class&nbsp;&nbsp; AC2&nbsp;&nbsp; {&#8230;}<br />
}<br />
namespace&nbsp;&nbsp; N2<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;&nbsp; class&nbsp;&nbsp; AC3&nbsp;&nbsp; {&#8230;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;&nbsp; class&nbsp;&nbsp; AC4{&#8230;}<br />
}<br />
装配件B：<br />
namespace&nbsp;&nbsp; N1<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;&nbsp; class&nbsp;&nbsp; BC1&nbsp;&nbsp; {&#8230;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;&nbsp; class&nbsp;&nbsp; BC2&nbsp;&nbsp; {&#8230;}<br />
}<br />
namespace&nbsp;&nbsp; N2<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;&nbsp; class&nbsp;&nbsp; BC3&nbsp;&nbsp; {&#8230;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;&nbsp; class&nbsp;&nbsp; BC4{&#8230;}<br />
}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这两个装配件中都有N1和N2两个命名空间，而且各声明了两个类，这样是完全可以的，然后我们在一个应用程序中引用装配件A，那么在这个应用程序中，我们能看到N1下面的类为AC1和AC2，N2下面的类为AC3和AC4。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接着我们去掉对A的引用，加上对B的引用，那么我们在这个应用程序下能看到的N1下面的类变成了BC1和BC2，N2下面也一样。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果我们同时引用这两个装配件，那么N1下面我们就能看到四个类：AC1、AC2、BC1和BC2。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 到这里，我们可以清楚一个概念了，命名空间只是说明一个类型是那个族的，比如有人是汉族、有人是回族；而装配件表明一个类型住在哪里，比如有人住在北京、有人住在上海；那么北京有汉族人，也有回族人，上海有汉族人，也有回族人，这是不矛盾的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面我们说了，装配件是一个类型居住的地方，那么在一个程序中要使用一个类，就必须告诉编译器这个类住在哪儿，编译器才能找到它，也就是说必须引用该装配件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那么如果在编写程序的时候，也许不确定这个类在哪里，仅仅只是知道它的名称，就不能使用了吗？答案是可以，这就是反射了，就是在程序运行的时候提供该类型的地址，而去找到它。<br />
有兴趣的话，接着往下看吧。</p>
<p>3、运行期得到类型信息有什么用<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有人也许疑问，既然在开发时就能够写好代码，干嘛还放到运行期去做，不光繁琐，而且效率也受影响。<br />
这就是个见仁见智的问题了，就跟早绑定和晚绑定一样，应用到不同的场合。有的人反对晚绑定，理由是损耗效率，但是很多人在享受虚函数带来的好处的时侯还没有意识到他已经用上了晚绑定。这个问题说开去，不是三言两语能讲清楚的，所以就点到为止了。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我的看法是，晚绑定能够带来很多设计上的便利，合适的使用能够大大提高程序的复用性和灵活性，但是任何东西都有两面性，使用的时侯，需要再三衡量。</p>
<p>接着说，运行期得到类型信息到底有什么用呢？<br />
还是举个例子来说明，很多软件开发者喜欢在自己的软件中留下一些接口，其他人可以编写一些插件来扩充软件的功能，比如我有一个媒体播放器，我希望以后可以很方便的扩展识别的格式，那么我声明一个接口：<br />
public&nbsp;&nbsp; interface&nbsp;&nbsp; IMediaFormat<br />
{<br />
string&nbsp;&nbsp; Extension&nbsp;&nbsp; {get;}<br />
Decoder&nbsp;&nbsp; GetDecoder();<br />
}<br />
这个接口中包含一个Extension属性，这个属性返回支持的扩展名，另一个方法返回一个解码器的对象（这里我假设了一个Decoder的类，这个类提供把文件流解码的功能，扩展插件可以派生之），通过解码器对象我就可以解释文件流。<br />
那么我规定所有的解码插件都必须派生一个解码器，并且实现这个接口，在GetDecoder方法中返回解码器对象，并且将其类型的名称配置到我的配置文件里面。<br />
这样的话，我就不需要在开发播放器的时侯知道将来扩展的格式的类型，只需要从配置文件中获取现在所有解码器的类型名称，而动态的创建媒体格式的对象，将其转换为IMediaFormat接口来使用。</p>
<p>这就是一个反射的典型应用。</p>
<p><br />
4、如何使用反射获取类型<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先我们来看如何获得类型信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获得类型信息有两种方法，一种是得到实例对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个时侯我仅仅是得到这个实例对象，得到的方式也许是一个object的引用，也许是一个接口的引用，但是我并不知道它的确切类型，我需要了解，那么就可以通过调用System.Object上声明的方法GetType来获取实例对象的类型对象，比如在某个方法内，我需要判断传递进来的参数是否实现了某个接口，如果实现了，则调用该接口的一个方法：<br />
&#8230;<br />
public&nbsp;&nbsp; void&nbsp;&nbsp; Process(&nbsp;&nbsp; object&nbsp;&nbsp; processObj&nbsp;&nbsp; )<br />
{<br />
Type&nbsp;&nbsp; t&nbsp;&nbsp; =&nbsp;&nbsp; processsObj.GetType();<br />
if(&nbsp;&nbsp; t.GetInterface(&#8220;ITest&#8221;)&nbsp;&nbsp; !=null&nbsp;&nbsp; )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;<br />
}<br />
&#8230;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外一种获取类型的方法是通过Type.GetType以及Assembly.GetType方法，如：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type&nbsp;&nbsp; t&nbsp;&nbsp; =&nbsp;&nbsp; Type.GetType(&#8220;System.String&#8221;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需要注意的是，前面我们讲到了命名空间和装配件的关系，要查找一个类，必须指定它所在的装配件，或者在已经获得的Assembly实例上面调用GetType。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本装配件中类型可以只写类型名称，另一个例外是mscorlib.dll，这个装配件中声明的类型也可以省略装配件名称（.Net装配件编译的时候，默认都引用了mscorlib.dll，除非在编译的时候明确指定不引用它），比如：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.String是在mscorlib.dll中声明的，上面的Type&nbsp;&nbsp; t&nbsp;&nbsp; =&nbsp;&nbsp; Type.GetType(&#8220;System.String&#8221;)是正确的<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Data.DataTable是在System.Data.dll中声明的，那么：<br />
Type.GetType(&#8220;System.Data.DataTable&#8221;)就只能得到空引用。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 必须：<br />
Type&nbsp;&nbsp; t&nbsp;&nbsp; =&nbsp;&nbsp; Type.GetType("System.Data.DataTable,System.Data,Version=1.0.3300.0,&nbsp;&nbsp; Culture=neutral,&nbsp;&nbsp; PublicKeyToken=b77a5c561934e089");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样才可以，大家可以看下面这个帖子：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://expert.csdn.net/Expert/topic/2210/2210762.xml?temp=.1919977">http://expert.csdn.net/Expert/topic/2210/2210762.xml?temp=.1919977</a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; qqchen的回答很精彩</p>
<p><br />
5、如何根据类型来动态创建对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Activator提供了方法来根据类型动态创建对象，比如创建一个DataTable：</p>
<p>Type&nbsp;&nbsp; t&nbsp;&nbsp; =&nbsp;&nbsp; Type.GetType("System.Data.DataTable,System.Data,Version=1.0.3300.0,&nbsp;&nbsp; Culture=neutral,&nbsp;&nbsp; PublicKeyToken=b77a5c561934e089");</p>
<p>DataTable&nbsp;&nbsp; table&nbsp;&nbsp; =&nbsp;&nbsp; (DataTable)Activator.CreateInstance(t);</p>
<p>&nbsp;&nbsp;&nbsp; 例二：根据有参数的构造器创建对象<br />
namespace&nbsp;&nbsp; TestSpace&nbsp; <br />
&nbsp;{<br />
&nbsp; public&nbsp;&nbsp; class&nbsp;&nbsp; TestClass<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private&nbsp;&nbsp; string&nbsp;&nbsp; _value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;&nbsp; TestClass(string&nbsp;&nbsp; value)&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _value=value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp; }<br />
}<br />
&#8230;<br />
Type&nbsp;&nbsp; t&nbsp;&nbsp; =&nbsp;&nbsp; Type.GetType(&#8220;TestSpace.TestClass&#8221;);<br />
Object[]&nbsp;&nbsp; constructParms&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; object[]&nbsp;&nbsp; {&#8220;hello&#8221;};&nbsp;&nbsp; //构造器参数<br />
TestClass&nbsp;&nbsp; obj&nbsp;&nbsp; =&nbsp;&nbsp; (TestClass)Activator.CreateInstance(t,constructParms);<br />
&#8230;<br />
把参数按照顺序放入一个Object数组中即可</p>
<p><br />
6、如何获取方法以及动态调用方法<br />
namespace&nbsp;&nbsp; TestSpace<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;&nbsp; class&nbsp;&nbsp; TestClass&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private&nbsp;&nbsp; string&nbsp;&nbsp; _value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;&nbsp; TestClass()&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;&nbsp; TestClass(string&nbsp;&nbsp; value)&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _value&nbsp;&nbsp; =&nbsp;&nbsp; value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;&nbsp; string&nbsp;&nbsp; GetValue(&nbsp;&nbsp; string&nbsp;&nbsp; prefix&nbsp;&nbsp; )&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(&nbsp;&nbsp; _value==null&nbsp;&nbsp; )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; "NULL";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; prefix+"&nbsp;&nbsp; :&nbsp;&nbsp; "+_value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;&nbsp; string&nbsp;&nbsp; Value&nbsp;&nbsp; {<br />
set&nbsp;&nbsp; {<br />
_value=value;<br />
}<br />
get&nbsp;&nbsp; {<br />
if(&nbsp;&nbsp; _value==null&nbsp;&nbsp; )<br />
return&nbsp;&nbsp; "NULL";<br />
else<br />
return&nbsp;&nbsp; _value;<br />
}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面是一个简单的类，包含一个有参数的构造器，一个GetValue的方法，一个Value属性，我们可以通过方法的名称来得到方法并且调用之，如：</p>
<p>//获取类型信息<br />
Type&nbsp;&nbsp; t&nbsp;&nbsp; =&nbsp;&nbsp; Type.GetType("TestSpace.TestClass");<br />
//构造器的参数<br />
object[]&nbsp;&nbsp; constuctParms&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; object[]{"timmy"};<br />
//根据类型创建对象<br />
object&nbsp;&nbsp; dObj&nbsp;&nbsp; =&nbsp;&nbsp; Activator.CreateInstance(t,constuctParms);<br />
//获取方法的信息<br />
MethodInfo&nbsp;&nbsp; method&nbsp;&nbsp; =&nbsp;&nbsp; t.GetMethod("GetValue");<br />
//调用方法的一些标志位，这里的含义是Public并且是实例方法，这也是默认的值<br />
BindingFlags&nbsp;&nbsp; flag&nbsp;&nbsp; =&nbsp;&nbsp; BindingFlags.Public&nbsp;&nbsp; |&nbsp;&nbsp; BindingFlags.Instance;<br />
//GetValue方法的参数<br />
object[]&nbsp;&nbsp; parameters&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; object[]{"Hello"};<br />
//调用方法，用一个object接收返回值<br />
object&nbsp;&nbsp; returnValue&nbsp;&nbsp; =&nbsp;&nbsp; method.Invoke(dObj,flag,Type.DefaultBinder,parameters,null);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 属性与方法的调用大同小异，大家也可以参考MSDN</p>
<p>7、动态创建委托<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 委托是C#中实现事件的基础，有时候不可避免的要动态的创建委托，实际上委托也是一种类型：System.Delegate，所有的委托都是从这个类派生的<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Delegate提供了一些静态方法来动态创建一个委托，比如一个委托：</p>
<p>namespace&nbsp;&nbsp; TestSpace&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delegate&nbsp;&nbsp; string&nbsp;&nbsp; TestDelegate(string&nbsp;&nbsp; value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;&nbsp; class&nbsp;&nbsp; TestClass&nbsp;&nbsp; {<br />
public&nbsp;&nbsp; TestClass()&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp;&nbsp; void&nbsp;&nbsp; GetValue(string&nbsp;&nbsp; value)&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>使用示例：<br />
TestClass&nbsp;&nbsp; obj&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; TestClass();</p>
<p>//获取类型，实际上这里也可以直接用typeof来获取类型<br />
Type&nbsp;&nbsp; t&nbsp;&nbsp; =&nbsp;&nbsp; Type.GetType(&#8220;TestSpace.TestClass&#8221;);<br />
//创建代理，传入类型、创建代理的对象以及方法名称<br />
TestDelegate&nbsp;&nbsp; method&nbsp;&nbsp; =&nbsp;&nbsp; (TestDelegate)Delegate.CreateDelegate(t,obj,&#8221;GetValue&#8221;);</p>
<p>String&nbsp;&nbsp; returnValue&nbsp;&nbsp; =&nbsp;&nbsp; method(&#8220;hello&#8221;);</p>
 <img src ="http://www.cnblogs.com/Henllyee/aggbug/1233246.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43002/" target="_blank">[新闻]关于 Silverlight 2 Control Tookit 的最新消息</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>WCF学习（二）-------服务契约</title><link>http://www.cnblogs.com/Henllyee/archive/2008/06/30/1232284.html</link><dc:creator>Henllyee Cui</dc:creator><author>Henllyee Cui</author><pubDate>Mon, 30 Jun 2008 02:14:00 GMT</pubDate><guid>http://www.cnblogs.com/Henllyee/archive/2008/06/30/1232284.html</guid><wfw:comment>http://www.cnblogs.com/Henllyee/comments/1232284.html</wfw:comment><comments>http://www.cnblogs.com/Henllyee/archive/2008/06/30/1232284.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/Henllyee/comments/commentRss/1232284.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Henllyee/services/trackbacks/1232284.html</trackback:ping><description><![CDATA[<strong>一、服务契约介绍<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong>我个人理解服务契约是一组公开的操作，其中公开的操作(OperationContract)只能定义在方法(Method)上。对于我们要公开的服务我们可以在接口或者类上加上标识ServiceContract。但是我们一般情况下，会把ServiceContract定义在接口上而不是类上，这样有几个好处：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.方便契约的继承，不同的类型可以去实现相同的契约，重用性高。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.同一服务可以去实现多个契约。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.可以随时去修改服务类型，而不需去修改接口。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面定义一个服务的契约：&nbsp;&nbsp;&nbsp;
<div class="cnblogs_code"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Linq;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Text;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.ServiceModel;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;Service<br />
<img id="Codehighlighter1_132_308_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_132_308_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_132_308_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_132_308_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_132_308_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_132_308_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_132_308_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_132_308_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_132_308_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_132_308_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;[ServiceContract(Name</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">Service_Calucator</span><span style="color: #800000">"</span><span style="color: #000000">,Namespace</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">Henllyee</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ICalucator<br />
<img id="Codehighlighter1_239_306_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_239_306_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_239_306_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_239_306_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_239_306_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_239_306_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_239_306_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_239_306_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_239_306_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_239_306_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[OperationContract]<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Add(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
我们在上面首先定义了一个接口名称为：ICalucator，然后我们要将这个接口公开为服务契约在上面加上属性标识[ServiceContract]，其中Name可以为契约指定别名，这样的话，如果我们在客户端遇到相同的接口时可以通过Name来制定别名区别开来。公开的操作为Add方法，在上面标识[OperationContract]即可。<br />
<br />
<strong>二、方法的重载<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;按照我们正常的方法去重载的话，只需要方法的参数不同（个数、类型）就可以实现方法的重载。但是我们在服务契约的定义的时候是不能怎样的，wdsl是编译同不过的如：<br />
<div class="cnblogs_code"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Linq;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Text;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.ServiceModel;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;Service<br />
<img id="Codehighlighter1_132_376_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_132_376_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_132_376_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_132_376_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_132_376_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_132_376_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_132_376_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_132_376_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_132_376_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_132_376_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;[ServiceContract(Name</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">Service_Calucator</span><span style="color: #800000">"</span><span style="color: #000000">,Namespace</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">Henllyee</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ICalucator<br />
<img id="Codehighlighter1_239_374_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_239_374_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_239_374_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_239_374_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_239_374_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_239_374_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_239_374_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_239_374_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_239_374_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_239_374_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[OperationContract]<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Add(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[OperationContract]<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;Add(</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;y);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span></div>
上面的方法是编译不能通过的。但是我们有一种解决的办法可以去解决这样的问题，就是通过OperationContract的Name属性来设定方法的别名是实现方法的重载。如：<br />
<div class="cnblogs_code"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Linq;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Text;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.ServiceModel;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;Service<br />
<img id="Codehighlighter1_132_409_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_132_409_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_132_409_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_132_409_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_132_409_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_132_409_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_132_409_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_132_409_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_132_409_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_132_409_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;[ServiceContract(Name</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">Service_Calucator</span><span style="color: #800000">"</span><span style="color: #000000">,Namespace</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">Henllyee</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ICalucator<br />
<img id="Codehighlighter1_239_407_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_239_407_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_239_407_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_239_407_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_239_407_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_239_407_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_239_407_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_239_407_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_239_407_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_239_407_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[OperationContract(Name</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">IntAdd</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Add(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[OperationContract(Name</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">DoubleAdd</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;Add(</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;y);<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
下面我们通过数据元的方式来配置一个宿主主机，我们添加一个控制台的程序，通过配置App.Config来实现。<br />
在App.Config中：<br />
<div class="cnblogs_code"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&lt;?</span><span style="color: #000000">xml&nbsp;version</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">1.0</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;encoding</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">utf-8</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">?&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">configuration</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">system.serviceModel</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">services</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">service&nbsp;name</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">Service.Calucator</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;behaviorConfiguration</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">mex</span><span style="color: #800000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">host</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">baseAddresses</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">add&nbsp;baseAddress</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">http://localhost:8888</span><span style="color: #800000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">baseAddresses</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">host</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">endpoint&nbsp;address</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">Calucator</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;binding</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">basicHttpBinding</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;contract</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">Service.ICalucator</span><span style="color: #800000">"</span><span style="color: #000000">&gt;&lt;/</span><span style="color: #000000">endpoint</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">service</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">services</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">behaviors</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">serviceBehaviors</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">behavior&nbsp;name</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">mex</span><span style="color: #800000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">serviceMetadata&nbsp;httpGetEnabled</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">true</span><span style="color: #800000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">behavior</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">serviceBehaviors</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">behaviors</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">system.serviceModel</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">configuration</span><span style="color: #000000">&gt;</span></div>
在主程序中：<br />
<div class="cnblogs_code"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Linq;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Text;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.ServiceModel;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;Service;<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;Host<br />
<img id="Codehighlighter1_144_594_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_144_594_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_144_594_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_144_594_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_144_594_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_144_594_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_144_594_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_144_594_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_144_594_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_144_594_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Program<br />
<img id="Codehighlighter1_168_592_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_168_592_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_168_592_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_168_592_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_168_592_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_168_592_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_168_592_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_168_592_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_168_592_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_168_592_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;