<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_2012 gogogo！！！！！！！！！</title><subtitle type="text">有点城府好不好啊！！！！！！！！！！！！！！</subtitle><id>http://feed.cnblogs.com/blog/u/41698/rss</id><updated>2012-02-09T00:36:52Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/41698/rss"/><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/02/09/2343454.html</id><title type="text">oracle配置</title><summary type="text">C:\oracle\product\10.2.0\client_1\network\ADMIN TNSNAMES.ORA</summary><published>2012-02-09T00:37:00Z</published><updated>2012-02-09T00:37:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/02/09/2343454.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/02/09/2343454.html"/><content type="html">C:\oracle\product\10.2.0\client_1\network\ADMIN&amp;nbsp;&amp;nbsp; TNSNAMES.ORA&lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2343454.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/02/09/2343454.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/02/08/2342154.html</id><title type="text">详解强大的jQuery选择器之过滤选择器、表单选择器</title><summary type="text">前言 上一篇文章(详解强大的jQuery选择器之基本选择器、层次选择器)介绍了jQuery四类选择器中的基本选择器、层次选择器，本文将介绍剩下的两种选择器：过滤选择器、表单选择器。 本文仍使用上一篇文章中的示例页面。一、过滤选择器 过滤选择器主要是通过特定的过滤规则来筛选出所需要的DOM元素，过滤规则与CSS中的伪类选择器语法相同。 按照不同的过滤规则，过滤选择器可以分为以下几种： 1、基本过滤选择器 2、内容过滤选择器 3、可见性过滤选择器 4、属性过滤选择器 5、子元素过滤选择器 6、表单对象属性过滤选择器 下面就对这几种过滤选择器分别加以介绍。1.1基本过滤选择器　...</summary><published>2012-02-08T00:34:00Z</published><updated>2012-02-08T00:34:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/02/08/2342154.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/02/08/2342154.html"/><content type="html">&lt;div id="cnblogs_post_body"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;上一篇文章(&lt;a href="http://www.cnblogs.com/artwl/archive/2012/02/06/2340617.html" target="_blank"&gt;&lt;font color="#399ab2"&gt;详解强大的jQuery选择器之基本选择器、层次选择器&lt;/font&gt;&lt;/a&gt;)介绍了jQuery四类选择器中的基本选择器、层次选择器，本文将介绍剩下的两种选择器：过滤选择器、表单选择器。&lt;/p&gt;&#xD;
&lt;p&gt;本文仍使用上一篇文章中的示例页面。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;一、过滤选择器&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;过滤选择器主要是通过特定的过滤规则来筛选出所需要的DOM元素，过滤规则与CSS中的伪类选择器语法相同。&lt;/p&gt;&#xD;
&lt;p&gt;按照不同的过滤规则，过滤选择器可以分为以下几种：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1、基本过滤选择器&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2、内容过滤选择器&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3、可见性过滤选择器&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4、属性过滤选择器&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;5、子元素过滤选择器&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;6、表单对象属性过滤选择器&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面就对这几种过滤选择器分别加以介绍。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.1基本过滤选择器&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;基本过滤选择器是过滤选择器中用的最多的一种，它的过滤规则主要体现在元素的位置(索引)上及一些特定的元素。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;基本过滤选择器规则：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;style&gt;&lt;!--&#xD;
		table{&#xD;
			border-collapse:collapse;&#xD;
			width:100%;&#xD;
		}&#xD;
		td{&#xD;
			border:#999 1px solid;&#xD;
			padding:5px;&#xD;
		}&#xD;
		.artwltitle{&#xD;
			text-align:center;&#xD;
			font-size:20px;&#xD;
			font-weight:bolder;&#xD;
		}&#xD;
		.head{&#xD;
			background-color:#CCC;&#xD;
			font-weight:bolder;&#xD;
		}&#xD;
		.head td{&#xD;
			text-align:center;&#xD;
		}&#xD;
--&gt;&lt;/style&gt;&#xD;
&#xD;
&lt;div &gt;基本过滤选择器&lt;/div&gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td&gt;选 择 器&lt;/td&gt;&#xD;
&lt;td&gt;描 述&lt;/td&gt;&#xD;
&lt;td&gt;返 回&lt;/td&gt;&#xD;
&lt;td&gt;示 例&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:first&lt;/td&gt;&#xD;
&lt;td&gt;选取第1个元素&lt;/td&gt;&#xD;
&lt;td&gt;单个元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div:first")选取所有 &amp;lt;div&amp;gt;元素&lt;br /&gt;中第一个&amp;lt;div&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:last&lt;/td&gt;&#xD;
&lt;td&gt;选取最后1个元素&lt;/td&gt;&#xD;
&lt;td&gt;单个元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div:last")选取所有 &amp;lt;div&amp;gt;元素&lt;br /&gt;中最后一个&amp;lt;div&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:not(selector)&lt;/td&gt;&#xD;
&lt;td&gt;去除所有与给定选择器&lt;br /&gt;匹配的元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("input:not(.myClass)")选取class不是&lt;br /&gt;myClass的&amp;lt;input&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:even&lt;/td&gt;&#xD;
&lt;td&gt;选取索引(从0开始)是偶数&lt;br /&gt;的所有元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("input:even")选取索引是偶数的&lt;br /&gt;&amp;lt;input&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:odd&lt;/td&gt;&#xD;
&lt;td&gt;选取索引(从0开始)是奇数&lt;br /&gt;的所有元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("input:odd")选取索引是奇数的&lt;br /&gt;&amp;lt;input&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:eq(index)&lt;/td&gt;&#xD;
&lt;td&gt;选取索引(从0开始)等于&lt;br /&gt;index的元素&lt;/td&gt;&#xD;
&lt;td&gt;单个元素&lt;/td&gt;&#xD;
&lt;td&gt;$("input:eq(1)")选取索引等于1的&lt;br /&gt;&amp;lt;input&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:gt(index)&lt;/td&gt;&#xD;
&lt;td&gt;选取索引(从0开始)大于&lt;br /&gt;index的元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("input:gt(1)")选取索引大于1的&lt;br /&gt;&amp;lt;input&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:lt(index)&lt;/td&gt;&#xD;
&lt;td&gt;选取索引(从0开始)小于&lt;br /&gt;index的元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("input:lt(1)")选取索引小于1的&lt;br /&gt;&amp;lt;input&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:header&lt;/td&gt;&#xD;
&lt;td&gt;选取所有的标题元素，即&lt;br /&gt;&amp;lt;h1&amp;gt;到&amp;lt;h6&amp;gt;&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$(":header")选取页面中所有的标题元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:animated&lt;/td&gt;&#xD;
&lt;td&gt;选取当前正在执行动画的&lt;br /&gt;所有元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div:animated")选取当前正在执行动画&lt;br /&gt;的&amp;lt;div&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.2内容过滤选择器&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;内容过滤选择器的过滤规则主要体现在它所含的子元素或文本内容上。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;内容过滤选择器规则：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;内容过滤选择器&lt;/div&gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td&gt;选 择 器&lt;/td&gt;&#xD;
&lt;td&gt;描 述&lt;/td&gt;&#xD;
&lt;td&gt;返 回&lt;/td&gt;&#xD;
&lt;td&gt;示 例&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:contains(text)&lt;/td&gt;&#xD;
&lt;td&gt;选取含有文本内容为 text 的元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div:contains('test')")选取含有文本内容&lt;br /&gt;为 test 的&amp;lt;div&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:empty&lt;/td&gt;&#xD;
&lt;td&gt;选取不包含子元素或文本的空元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div:empty")选取不包含子元素或文本&lt;br /&gt;的空&amp;lt;div&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:has(selector)&lt;/td&gt;&#xD;
&lt;td&gt;选取含有给定选择器&lt;br /&gt;匹配的元素的元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div:has(.myClass)")选取含有class为&lt;br /&gt;myClass的元素的&amp;lt;div&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:parent&lt;/td&gt;&#xD;
&lt;td&gt;选取含有子元素或文本的元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div:parent")选取含有子元素或文本的&lt;br /&gt;&amp;lt;div&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.3可见性过滤选择器&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;可见性过滤选择器是根据元素的可见和不可见状态来选择相应的元素。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;可见性过滤选择器规则：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;可见性过滤选择器&lt;/div&gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td&gt;选 择 器&lt;/td&gt;&#xD;
&lt;td&gt;描 述&lt;/td&gt;&#xD;
&lt;td&gt;返 回&lt;/td&gt;&#xD;
&lt;td&gt;示 例&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:hidden&lt;/td&gt;&#xD;
&lt;td&gt;选取所有不可见的元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div:hidden")选取所有不可见的&amp;lt;div&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:visible&lt;/td&gt;&#xD;
&lt;td&gt;选取所有不可见的元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div:visible")选取所有可见的&amp;lt;div&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.4属性过滤选择器&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;属性过滤选择器的过滤规则是通过元素的属性来获取相应的元素。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;属性过滤选择器规则：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;属性过滤选择器&lt;/div&gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td&gt;选 择 器&lt;/td&gt;&#xD;
&lt;td&gt;描 述&lt;/td&gt;&#xD;
&lt;td&gt;返 回&lt;/td&gt;&#xD;
&lt;td&gt;示 例&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;[attribute]&lt;/td&gt;&#xD;
&lt;td&gt;选取拥有此属性的元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div[id]")选取拥有属性id的元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;[attribute=value]&lt;/td&gt;&#xD;
&lt;td&gt;选取属性的值为value的元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div[title=test]")选取属性 title 为&lt;br /&gt;test 的&amp;lt;div&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;[attribute!=value]&lt;/td&gt;&#xD;
&lt;td&gt;选取属性的值不等于value的元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div[title!=test]")选取属性 title 不&lt;br /&gt;等于 test 的&amp;lt;div&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;[attribute^=value]&lt;/td&gt;&#xD;
&lt;td&gt;选取属性的值以value开始的元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div[title^=test]")选取属性 title 以&lt;br /&gt;test 开始的&amp;lt;div&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;[attribute$=value]&lt;/td&gt;&#xD;
&lt;td&gt;选取属性的值以value结束的元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div[title$=test]")选取属性 title 以&lt;br /&gt;test 结束的&amp;lt;div&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;[attribute*=value]&lt;/td&gt;&#xD;
&lt;td&gt;选取属性的值含有value的元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div[title*=test]")选取属性 title 含&lt;br /&gt;有 test 的&amp;lt;div&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;[selector1][selector2]&lt;br /&gt;...[selectorN]&lt;/td&gt;&#xD;
&lt;td&gt;选取匹配以上所有属性&lt;br /&gt;选择器的元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div[id][title*=test]")选取拥有属性id，&lt;br /&gt;且属性 title 含有 test 的&amp;lt;div&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.5子元素过滤选择器&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;子元素过滤选择器的过滤规则是通过元素的父子关系来获取相应的元素。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;子元素过滤选择器规则：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;子元素过滤选择器&lt;/div&gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td&gt;选 择 器&lt;/td&gt;&#xD;
&lt;td&gt;描 述&lt;/td&gt;&#xD;
&lt;td&gt;返 回&lt;/td&gt;&#xD;
&lt;td&gt;示 例&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;:nth-child(index/&lt;/p&gt;&#xD;
&lt;p&gt;even/odd/equation)&lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;选取每个父元素下的第index(索引值为奇数/&lt;/p&gt;&#xD;
&lt;p&gt;索引值为偶数/索引值等于某个表达式)个子元&lt;/p&gt;&#xD;
&lt;p&gt;素，index从1开始&lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div:nth-child(1)")选取每个&amp;lt;div&amp;gt;中第一个子元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:first-child&lt;/td&gt;&#xD;
&lt;td&gt;选取每个父元素下的第1个子元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div :first-child")选取每个&amp;lt;div&amp;gt;下第一个子元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:last-child&lt;/td&gt;&#xD;
&lt;td&gt;选取每个父元素下的最后1个子元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div :last-child")选取每个&amp;lt;div&amp;gt;下最后一个子元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:only-child&lt;/td&gt;&#xD;
&lt;td&gt;选取只有唯一子元素的元素的子元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("div :only-child")选择只有一个子元素的&amp;lt;div&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p&gt;这里值得一提的是:nth-child()，这个选择器的详细功能如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1、nth-child(even) 能选取每个父元素下的索引值是偶数的元素&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2、nth-child(odd)&amp;nbsp;能选取每个父元素下的索引值是奇数的元素&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　　3、nth-child(2) 能选取每个父元素下的索引值等于2的元素&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　　4、nth-child(3n)&amp;nbsp;能选取每个父元素下的索引值等于3的倍数的元素，n从0开始&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　　5、nth-child(3n+1)&amp;nbsp;能选取每个父元素下的索引值等于 (3n+1) 的的元素，n从0开始&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.6表单对象属性过滤选择器&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;此选择器主要是对所选择的表单元素进行过滤。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;表单对象属性过滤选择器规则：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;表单对象属性过滤选择器&lt;/div&gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td&gt;选 择 器&lt;/td&gt;&#xD;
&lt;td&gt;描 述&lt;/td&gt;&#xD;
&lt;td&gt;返 回&lt;/td&gt;&#xD;
&lt;td&gt;示 例&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:enabled&lt;/td&gt;&#xD;
&lt;td&gt;选取所有可用元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("body:enabled")选取页面内所有可用元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:disabled&lt;/td&gt;&#xD;
&lt;td&gt;选取所有不可用元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("body:disabled")选取页面内所有不可用元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:checked&lt;/td&gt;&#xD;
&lt;td&gt;选取所有被选中的元素(单选框、复选框)&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("input:checked")选取所有被选中的&amp;lt;input&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:selected&lt;/td&gt;&#xD;
&lt;td&gt;选取所有被选中的选项元素(下拉列表)&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$("select:selected")选取所有被选中的选项元素&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;二、表单选择器&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;顾名思义，表单选择器是为了能更加容易地操作表单，表单选择器是根据元素类型来定义的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;表单选择器规则：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;表单选择器&lt;/div&gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td&gt;选 择 器&lt;/td&gt;&#xD;
&lt;td&gt;描 述&lt;/td&gt;&#xD;
&lt;td&gt;返 回&lt;/td&gt;&#xD;
&lt;td&gt;示 例&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:input&lt;/td&gt;&#xD;
&lt;td&gt;选取所有的&amp;lt;input&amp;gt;、&amp;lt;textarea&amp;gt;、&lt;br /&gt;&amp;lt;select&amp;gt;和&amp;lt;button&amp;gt;元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$(":input")选取所有的&amp;lt;input&amp;gt;、&amp;lt;textarea&amp;gt;、&lt;br /&gt;&amp;lt;select&amp;gt;和&amp;lt;button&amp;gt;元素&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:text&lt;/td&gt;&#xD;
&lt;td&gt;选取所有的单行文本框&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$(":text")选取所有的单行文本框&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:password&lt;/td&gt;&#xD;
&lt;td&gt;选取所有的密码框&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$(":password")选取所有的密码框&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:radio&lt;/td&gt;&#xD;
&lt;td&gt;选取所有的单选框&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$(":radio")选取所有的单选框&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:checkbox&lt;/td&gt;&#xD;
&lt;td&gt;选取所有的多选框&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$(":checkbox")选取所有的多选框&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:submit&lt;/td&gt;&#xD;
&lt;td&gt;选取所有的提交按钮&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$(":submit")选取所有的提交按钮&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:image&lt;/td&gt;&#xD;
&lt;td&gt;选取所有的图像按钮&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$(":image")选取所有的图像按钮&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:reset&lt;/td&gt;&#xD;
&lt;td&gt;选取所有的重置按钮&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$(":reset")选取所有的重置按钮&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:button&lt;/td&gt;&#xD;
&lt;td&gt;选取所有的按钮&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$(":button")选取所有的按钮&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:file&lt;/td&gt;&#xD;
&lt;td&gt;选取所有的上传按钮&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$(":file")选取所有的上传按钮&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;:hidden&lt;/td&gt;&#xD;
&lt;td&gt;选取所有的不可见元素&lt;/td&gt;&#xD;
&lt;td&gt;集合元素&lt;/td&gt;&#xD;
&lt;td&gt;$(":hidden")选取所有的不可见元素&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;小结&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;本文主要介绍了jQuery选择器中的过滤选择器和表单选择器，并对每种类型的选择器给出了示例代码，希望能对大家有所帮助。本人也是jQuery的初学者，欢迎大家拍砖。&lt;/p&gt;&#xD;
&lt;p&gt;参考书籍：《锋利的jQuery》(人民邮电出版社)&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;div id="MySignature"&gt;&#xD;
&lt;div style="border-bottom: #999999 1px solid; border-left: #999999 1px solid; padding-bottom: 8px; padding-left: 8px; padding-right: 8px; border-top: #999999 1px solid; border-right: #999999 1px solid; padding-top: 8px"&gt;&#xD;
&lt;div style="width: 128px; float: left; height: 128px"&gt;&lt;img alt="版权" src="http://images.cnblogs.com/cnblogs_com/durongjian/269436/r_blogalarm.png" /&gt;&lt;/div&gt;&#xD;
&lt;div style="height: 128px"&gt;作者：&lt;a style="color: #ff0000" href="http://artwl.cnblogs.com/"&gt;天行健，自强不息&lt;/a&gt;&lt;br /&gt;&#xD;
&lt;p&gt;出处：&lt;a href="http://artwl.cnblogs.com/"&gt;&lt;font color="#399ab2"&gt;http://artwl.cnblogs.com&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;本文首发博客园，版权归作者跟博客园共有。&lt;/p&gt;&#xD;
&lt;p&gt;转载必须保留本段声明，并在页面显著位置给出本文链接，否则保留追究法律责任的权利。&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;div style="clear: both"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div id="blog_post_info_block"&gt;&#xD;
&lt;div id="BlogPostCategory"&gt;分类: &lt;a href="http://www.cnblogs.com/artwl/category/316163.html"&gt;&lt;font color="#399ab2"&gt;JavaScript&lt;/font&gt;&lt;/a&gt;, &lt;a href="http://www.cnblogs.com/artwl/category/316164.html"&gt;&lt;font color="#399ab2"&gt;jQuery&lt;/font&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2342154.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/02/08/2342154.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/02/07/2341565.html</id><title type="text">jQuery插件原来如此简单——jQuery插件的机制及实战</title><summary type="text">jQuery插件的种类1、封装对象方法 这种插件是将对象方法封装起来，用于对通过选择器获取的jQuery对象进行操作，是最常见的一种插件。此类插件可以发挥出jQuery选择器的强大优势，有相当一部分的jQuery的方法，都是在jQuery脚本库内部通过这种形式“插”在内核上的，例如parent()方法，appendTo()方法等。2、封装全局函数 可以将独立的函数加到jQuery命名空间下。如常用的jQuery.ajax()方法、去首尾空格的jQuery.trim()方法，都是jQuery内部作为全局函数的插件附加到内核上去的。3、选择器插件 虽然jQuery的选择器十分强大，但在少数情...</summary><published>2012-02-07T07:52:00Z</published><updated>2012-02-07T07:52:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/02/07/2341565.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/02/07/2341565.html"/><content type="html">&lt;p&gt;&lt;strong&gt;jQuery插件的种类&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1、封装对象方法&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这种插件是将对象方法封装起来，用于对通过选择器获取的jQuery对象进行操作，是最常见的一种插件。此类插件可以发挥出jQuery选择器的强大优势，有相当一部分的jQuery的方法，都是在jQuery脚本库内部通过这种形式&amp;#8220;插&amp;#8221;在内核上的，例如parent()方法，appendTo()方法等。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2、封装全局函数&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;可以将独立的函数加到jQuery命名空间下。如常用的jQuery.ajax()方法、去首尾空格的jQuery.trim()方法，都是jQuery内部作为全局函数的插件附加到内核上去的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3、选择器插件&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;虽然jQuery的选择器十分强大，但在少数情况下，还是会需要用到选择器插件来扩充一些自己喜欢的选择器。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;jQuery插件的机制&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;jQuery插件的机制很简单，就是利用jQuery提供的jQuery.fn.extend()和jQuery.extend()方法，扩展jQuery的功能。&lt;/p&gt;&#xD;
&lt;p&gt;jQuery.fn.extend()多用于扩展上面提到的3种类型中的第一种，jQuery.extend()用于扩展后两种插件。这两个方法都接受一个参数，类型为Object。Object对象的&amp;#8220;名/值对&amp;#8221;分别代表&amp;#8220;函数或方法名/函数主体&amp;#8221;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;编写jQuery插件的一些Tips&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1、jQuery插件的文件名推荐命名为jquery.[插件名].js，以免和其他JS库插件混淆。&lt;/p&gt;&#xD;
&lt;p&gt;2、所有的对象方法都应当附加到jQuery.fn对象上，而所有的全局函数都应当附加到jQuery对象本身。&lt;/p&gt;&#xD;
&lt;p&gt;3、在插件头部加上一个分号，以免他人的不规范代码给插件带来影响。&lt;/p&gt;&#xD;
&lt;p&gt;4、所有的方法或函数插件，都应当以分号结尾，以免压缩时出现问题&lt;/p&gt;&#xD;
&lt;p&gt;5、除非插件需要返回的是一些需要获取的变量，插件应该返回一个jQuery对象，以保证插件的可链式操作。&lt;/p&gt;&#xD;
&lt;p&gt;6、利于jQuery.extend()方法设置插件方法的默认参数，增加插件的可用性。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;jQuery插件结构&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;jQuery插件结构如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;;(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;($){&lt;br /&gt;    &lt;span style="color: #008000"&gt;/*&lt;/span&gt;&lt;span style="color: #008000"&gt;这里放插件代码，可以将$作为jQuery的别名&lt;/span&gt;&lt;span style="color: #008000"&gt;*/&lt;/span&gt;&lt;br /&gt;})(jQuery);&lt;/pre&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a onclick="copyCnblogsCode(this)" href="http://www.cnblogs.com/aaa6818162/admin/javascript:void(0);" target="_blank"&gt;&lt;font color="#399ab2"&gt;复制代码&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;封装jQuery对象方法插件实战&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;功能：&lt;/strong&gt;设置选择的元素的颜色，获取选择的首个元素的颜色&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;命名：&lt;/strong&gt;jquery.color.js&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;结构：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;;(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;($){&lt;br /&gt;    $.fn.extend({&lt;br /&gt;         &lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;这里写插件代码&lt;/span&gt;&lt;br /&gt;    });&lt;br /&gt;})(jQuery);&lt;/pre&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a onclick="copyCnblogsCode(this)" href="http://www.cnblogs.com/aaa6818162/admin/javascript:void(0);" target="_blank"&gt;&lt;font color="#399ab2"&gt;复制代码&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;思路：&lt;/strong&gt;设置一个参数value，如果调用时传递了value这个参数，就是设置颜色，否则为获取颜色。获取和设置颜色可以用jQuery提供的css方法即可&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;完整代码：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;;(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;($){&lt;br /&gt;    $.fn.extend({&lt;br /&gt;        "color":&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(value){&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(value==undefined){&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.css("color");&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;else&lt;/span&gt;{&lt;br /&gt;                &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.css("color",value);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    });&lt;br /&gt;})(jQuery);&lt;/pre&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a onclick="copyCnblogsCode(this)" href="http://www.cnblogs.com/aaa6818162/admin/javascript:void(0);" target="_blank"&gt;&lt;font color="#399ab2"&gt;复制代码&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;由于css()方法在获取颜色时已有取第一个元素的判断，所以这里直接用this.css("color")即可。&lt;/p&gt;&#xD;
&lt;p&gt;如果是一组插件，可以用如下写法：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;;(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;($){&lt;br /&gt;    $.fn.extend({&lt;br /&gt;        "color":&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(value){&lt;br /&gt;            //插件代码&lt;br /&gt;        }，&lt;br /&gt;        "border":&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(value){&lt;br /&gt;            //插件代码&lt;br /&gt;        }，&lt;br /&gt;        "background":&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(value){&lt;br /&gt;            //插件代码&lt;br /&gt;        }&lt;br /&gt;    });&lt;br /&gt;})(jQuery);&lt;/pre&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a onclick="copyCnblogsCode(this)" href="http://www.cnblogs.com/aaa6818162/admin/javascript:void(0);" target="_blank"&gt;&lt;font color="#399ab2"&gt;复制代码&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;插件测试：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;封装全局函数插件实战&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;功能：&lt;/strong&gt;单独去除左侧或单独去除右侧的空格&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;命名：&lt;/strong&gt;jquery.lrtrim.js&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;结构：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;;(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;($){&lt;br /&gt;    $.extend({&lt;br /&gt;        ltrim:&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(text){&lt;br /&gt;            &lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;插件代码&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;        }，&lt;br /&gt;        rtrim:&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(text){&lt;br /&gt;            &lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;插件代码&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;        }&lt;br /&gt;    });&lt;br /&gt;})(jQuery);&lt;/pre&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a onclick="copyCnblogsCode(this)" href="http://www.cnblogs.com/aaa6818162/admin/javascript:void(0);" target="_blank"&gt;&lt;font color="#399ab2"&gt;复制代码&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;思路：&lt;/strong&gt;这类插件是在jQuery命名空间内部添加一个函数，直接用正则表达式即可。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;完整代码：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;;(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;($){&lt;br /&gt;    $.extend({&lt;br /&gt;        ltrim:&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(text){&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; (text||"").replace(/^\s+/g,"");&lt;br /&gt;        },&lt;br /&gt;        rtrim:&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(text){&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; (text||"").replace(/\s+$/g,"");&lt;br /&gt;        }&lt;br /&gt;    });&lt;br /&gt;})(jQuery);&lt;/pre&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a onclick="copyCnblogsCode(this)" href="http://www.cnblogs.com/aaa6818162/admin/javascript:void(0);" target="_blank"&gt;&lt;font color="#399ab2"&gt;复制代码&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;插件测试：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;自定义选择器插件实战&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;jQuery以其强大的选择器著称，那么jQuery的选择器的工作原理是什么呢？&lt;/p&gt;&#xD;
&lt;p&gt;jQuery的选择解析器首先会使用一组正则表达式来解析选择器，然后针对解析出的每一个选择符执行一个函数，称为选择函数。最后根据这个选择函数的返回值为true还是false来决定是否保留这个元素，这样就可以找到匹配的元素节点。&lt;/p&gt;&#xD;
&lt;p&gt;如$("div:gl(1)")，该选择器首先会获取所有的&amp;lt;div&amp;gt;元素，然后隐式地遍历这些&amp;lt;div&amp;gt;元素，并逐个将这些&amp;lt;div&amp;gt;元素作为参数，连同括号里的&amp;#8220;1&amp;#8221;等一些参数一起传递给gt对应的选择器函数进行判断。如果返回true则保留，否则不保留，这样得到的结果就是一个符合要求的&amp;lt;div&amp;gt;元素的集合。&lt;/p&gt;&#xD;
&lt;p&gt;选择器的函数一共接受3个参数，形式如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt; (a,i,m){&lt;br /&gt;         &lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;...&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;/pre&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a onclick="copyCnblogsCode(this)" href="http://www.cnblogs.com/aaa6818162/admin/javascript:void(0);" target="_blank"&gt;&lt;font color="#399ab2"&gt;复制代码&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;第一个参数为a，指的是当前遍历到的DOM元素。&lt;/p&gt;&#xD;
&lt;p&gt;第二个参数为i，指的是当前遍历到的DOM元素的索引值，从0开始。&lt;/p&gt;&#xD;
&lt;p&gt;第三个参数是m，它是由jQuery正则解析引擎进一步解析后的产物，是一个数组：其中最重要的一个是m[3]，在$("div:gl(1)")中即为括号里的数字&amp;#8220;1&amp;#8221;。&lt;/p&gt;&#xD;
&lt;p&gt;在jQuery中已经有lt,gt和eq选择器，因此这里写一个介于两者之间(between)的选择器。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;功能：&lt;/strong&gt;选择索引值为a到b之间(a&amp;lt;b，a、b为正整数)的元素&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;命名：&lt;/strong&gt;jquery.between.js&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;结构：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;;(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;($){&lt;br /&gt;    $.extend($.expr[":"],{&lt;br /&gt;        between:&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(a,i,m){&lt;br /&gt;            &lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;插件代码&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;        }&lt;br /&gt;    });&lt;br /&gt;})(jQuery);&lt;/pre&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a onclick="copyCnblogsCode(this)" href="http://www.cnblogs.com/aaa6818162/admin/javascript:void(0);" target="_blank"&gt;&lt;font color="#399ab2"&gt;复制代码&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;思路：&lt;/strong&gt;在上面的三个参数中，m[3]为"a,b"的形式，因此把m[3]用","分隔，然后跟索引值i进行对比，如果i在m[3]表示的范围之间就返回true，否则为false&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;完整代码：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;;(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;($){&lt;br /&gt;    $.extend($.expr[":"],{&lt;br /&gt;        between:&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(a,i,m){&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; temp=m[3].split(",");&lt;br /&gt;            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; +temp[0]&amp;lt;i&amp;amp;&amp;amp;i&amp;lt;+temp[1];&lt;br /&gt;        }&lt;br /&gt;    });&lt;br /&gt;})(jQuery);&lt;/pre&gt;&#xD;
&lt;div &gt;&lt;span &gt;&lt;a onclick="copyCnblogsCode(this)" href="http://www.cnblogs.com/aaa6818162/admin/javascript:void(0);" target="_blank"&gt;&lt;font color="#399ab2"&gt;复制代码&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;注：这里用+temp[0]、+temp[1]把字符串形式的数字转换成了数字&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;插件测试：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;小结&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;本文主要介绍了jQuery插件的种类，机制，并针对每种类型进行了实战，希望能对大家有所帮助。本人也是jQuery的初学者，欢迎大家拍砖。&lt;/p&gt;&#xD;
&lt;p&gt;参考书籍：《锋利的jQuery》(人民邮电出版社)&lt;/p&gt;&lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2341565.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/02/07/2341565.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/02/07/2341536.html</id><title type="text">PostSharp</title><summary type="text">Aspect Classes The following table gives a list of available primitive aspect classes. Every aspect class is described in greater detailed in the class reference documentation. Aspect Type Targets Description OnMethodBoundaryAspect MethodsMethods enhanced with an OnMethodBoundaryAspect are wrapped b</summary><published>2012-02-07T07:25:00Z</published><updated>2012-02-07T07:25:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/02/07/2341536.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/02/07/2341536.html"/><content type="html">Aspect Classes &#xD;
&lt;div id="sectionSectionID0EHBAA"  name="collapseableSection"&gt;&#xD;
&lt;p&gt;The following table gives a list of available primitive aspect classes. Every aspect class is described in greater detailed in the class reference documentation. &lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table cellspacing="2" cellpadding="5" width="50%" frame="lhs"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;th&gt;&#xD;
&lt;p&gt;Aspect Type &lt;/p&gt;&lt;/th&gt;&#xD;
&lt;th&gt;&#xD;
&lt;p&gt;Targets &lt;/p&gt;&lt;/th&gt;&#xD;
&lt;th&gt;&#xD;
&lt;p&gt;Description &lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;&lt;span target="T:PostSharp.Aspects.OnMethodBoundaryAspect" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/T_PostSharp_Aspects_OnMethodBoundaryAspect.htm"&gt;OnMethodBoundaryAspect&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;Methods&lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;Methods enhanced with an &lt;span &gt;OnMethodBoundaryAspect&lt;/span&gt; are wrapped by a &lt;span &gt;try&lt;/span&gt;/&lt;span &gt;catch&lt;/span&gt;/&lt;span &gt;finally&lt;/span&gt; construct. This aspect provides the advices &lt;span target="M:PostSharp.Aspects.OnMethodBoundaryAspect.OnEntry(PostSharp.Aspects.MethodExecutionArgs)" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/M_PostSharp_Aspects_OnMethodBoundaryAspect_OnEntry.htm"&gt;OnEntry(MethodExecutionArgs)&lt;/a&gt;&lt;/span&gt;, &lt;span target="M:PostSharp.Aspects.OnMethodBoundaryAspect.OnSuccess(PostSharp.Aspects.MethodExecutionArgs)" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/M_PostSharp_Aspects_OnMethodBoundaryAspect_OnSuccess.htm"&gt;OnSuccess(MethodExecutionArgs)&lt;/a&gt;&lt;/span&gt;, &lt;span target="M:PostSharp.Aspects.OnMethodBoundaryAspect.OnException(PostSharp.Aspects.MethodExecutionArgs)" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/M_PostSharp_Aspects_OnMethodBoundaryAspect_OnException.htm"&gt;OnException(MethodExecutionArgs)&lt;/a&gt;&lt;/span&gt; and &lt;span target="M:PostSharp.Aspects.OnMethodBoundaryAspect.OnExit(PostSharp.Aspects.MethodExecutionArgs)" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/M_PostSharp_Aspects_OnMethodBoundaryAspect_OnExit.htm"&gt;OnExit(MethodExecutionArgs)&lt;/a&gt;&lt;/span&gt;; these advices are invoked directly from the transformed method. the return value, and the exception (if applicable). This aspect is useful to implement tracing or transaction handling, for instance. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;&lt;span target="T:PostSharp.Aspects.OnExceptionAspect" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/T_PostSharp_Aspects_OnExceptionAspect.htm"&gt;OnExceptionAspect&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;Methods&lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;Methods enhanced with an &lt;span &gt;OnExceptionAspect&lt;/span&gt; are wrapped by a &lt;span &gt;try&lt;/span&gt;/&lt;span &gt;catch&lt;/span&gt; construct. This aspect provides the advice &lt;span target="M:PostSharp.Aspects.OnExceptionAspect.OnException(PostSharp.Aspects.MethodExecutionArgs)" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/M_PostSharp_Aspects_OnExceptionAspect_OnException.htm"&gt;OnException(MethodExecutionArgs)&lt;/a&gt;&lt;/span&gt;; this advice is invoked from the &lt;span &gt;catch&lt;/span&gt; block. This aspect is useful to implement exception handling policies. Contrarily to &lt;span target="T:PostSharp.Aspects.OnMethodBoundaryAspect" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/T_PostSharp_Aspects_OnMethodBoundaryAspect.htm"&gt;OnMethodBoundaryAspect&lt;/a&gt;&lt;/span&gt;, this aspect lets you define the type of caught exceptions by overriding the method &lt;span target="M:PostSharp.Aspects.OnExceptionAspect.GetExceptionType(System.Reflection.MethodBase)" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/M_PostSharp_Aspects_OnExceptionAspect_GetExceptionType.htm"&gt;GetExceptionType(MethodBase)&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;&lt;span target="T:PostSharp.Aspects.MethodInterceptionAspect" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/T_PostSharp_Aspects_MethodInterceptionAspect.htm"&gt;MethodInterceptionAspect&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;Methods&lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;When a method is enhanced by a &lt;span &gt;MethodInterceptionAspect&lt;/span&gt;, all calls to this method are replaced by calls to &lt;span target="M:PostSharp.Aspects.MethodInterceptionAspect.OnInvoke(PostSharp.Aspects.MethodInterceptionArgs)" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/M_PostSharp_Aspects_MethodInterceptionAspect_OnInvoke.htm"&gt;OnInvoke(MethodInterceptionArgs)&lt;/a&gt;&lt;/span&gt;, the only advice of this aspect type. This aspect is useful when the execution of target method can be deferred (asynchronous calls), must be dispatched on a different thread. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;&lt;span target="T:PostSharp.Aspects.LocationInterceptionAspect" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/T_PostSharp_Aspects_LocationInterceptionAspect.htm"&gt;LocationInterceptionAspect&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;Fields, Properties&lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;When a field or property is enhanced by a &lt;span &gt;LocationInterceptionAspect&lt;/span&gt;, all calls to its accessors are replaced by calls to advices &lt;span target="M:PostSharp.Aspects.LocationInterceptionAspect.OnGetValue(PostSharp.Aspects.LocationInterceptionArgs)" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/M_PostSharp_Aspects_LocationInterceptionAspect_OnGetValue.htm"&gt;OnGetValue(LocationInterceptionArgs)&lt;/a&gt;&lt;/span&gt; and &lt;span target="M:PostSharp.Aspects.LocationInterceptionAspect.OnSetValue(PostSharp.Aspects.LocationInterceptionArgs)" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/M_PostSharp_Aspects_LocationInterceptionAspect_OnSetValue.htm"&gt;OnSetValue(LocationInterceptionArgs)&lt;/a&gt;&lt;/span&gt;. Fields are transparently replaced by properties. This aspect is useful to implement functionalities that need to get or set the location value, such as the observability design pattern (&lt;span target="T:System.ComponentModel.INotifyPropertyChanged" sdata="cer"&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms133020" target="_blank"&gt;INotifyPropertyChanged&lt;/a&gt;&lt;/span&gt;). &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;&lt;span target="T:PostSharp.Aspects.EventInterceptionAspect" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/T_PostSharp_Aspects_EventInterceptionAspect.htm"&gt;EventInterceptionAspect&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;Events&lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;When an event is enhanced by an &lt;span &gt;EventInterceptionAspect&lt;/span&gt;, all calls to its &lt;span &gt;add&lt;/span&gt; and &lt;span &gt;remove&lt;/span&gt; semantics are replaced by calls to advices &lt;span target="M:PostSharp.Aspects.EventInterceptionAspect.OnAddHandler(PostSharp.Aspects.EventInterceptionArgs)" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/M_PostSharp_Aspects_EventInterceptionAspect_OnAddHandler.htm"&gt;OnAddHandler(EventInterceptionArgs)&lt;/a&gt;&lt;/span&gt; and &lt;span target="M:PostSharp.Aspects.EventInterceptionAspect.OnRemoveHandler(PostSharp.Aspects.EventInterceptionArgs)" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/M_PostSharp_Aspects_EventInterceptionAspect_OnRemoveHandler.htm"&gt;OnRemoveHandler(EventInterceptionArgs)&lt;/a&gt;&lt;/span&gt;. Additionally, when the event is fired, even of invoking directly the handlers that were added to the event, the advice &lt;span target="M:PostSharp.Aspects.EventInterceptionAspect.OnInvokeHandler(PostSharp.Aspects.EventInterceptionArgs)" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/M_PostSharp_Aspects_EventInterceptionAspect_OnInvokeHandler.htm"&gt;OnInvokeHandler(EventInterceptionArgs)&lt;/a&gt;&lt;/span&gt; is called instead. This aspect is useful to add functionalities to events, such as implementing asynchronous events or materialized list of subscribers. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;&lt;span target="T:PostSharp.Aspects.CompositionAspect" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/T_PostSharp_Aspects_CompositionAspect.htm"&gt;CompositionAspect&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;Types&lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;This aspect introduces an interface into a type by composition. The interface is introduced statically; the aspect method &lt;span target="M:PostSharp.Aspects.CompositionAspect.GetPublicInterfaces(System.Type)" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/M_PostSharp_Aspects_CompositionAspect_GetPublicInterfaces.htm"&gt;GetPublicInterfaces(Type)&lt;/a&gt;&lt;/span&gt; should return the type of introduced interfaces. However, the object implementing the interface is created dynamically at runtime by the implementation of the method &lt;span target="M:PostSharp.Aspects.CompositionAspect.CreateImplementationObject(PostSharp.Aspects.AdviceArgs)" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/M_PostSharp_Aspects_CompositionAspect_CreateImplementationObject.htm"&gt;CreateImplementationObject(AdviceArgs)&lt;/a&gt;&lt;/span&gt;. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;&lt;span target="T:PostSharp.Aspects.CustomAttributeIntroductionAspect" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/T_PostSharp_Aspects_CustomAttributeIntroductionAspect.htm"&gt;CustomAttributeIntroductionAspect&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;Any&lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;This aspect introduces a custom attribute on any element of code. A custom attribute can be represented as a &lt;span target="T:System.Reflection.CustomAttributeData" sdata="cer"&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/yh3c6wh2" target="_blank"&gt;CustomAttributeData&lt;/a&gt;&lt;/span&gt; or a &lt;span target="T:PostSharp.Reflection.ObjectConstruction" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/T_PostSharp_Reflection_ObjectConstruction.htm"&gt;ObjectConstruction&lt;/a&gt;&lt;/span&gt;. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;&lt;span target="T:PostSharp.Aspects.ManagedResourceIntroductionAspect" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/T_PostSharp_Aspects_ManagedResourceIntroductionAspect.htm"&gt;ManagedResourceIntroductionAspect&lt;/a&gt;&lt;/span&gt; &lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;Assemblies&lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;This aspect introduces a managed resource into the current assembly. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;th&gt;&lt;img title="Tip" src="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/icons/alert_note.gif"  alt="" /&gt; &lt;strong&gt;Tip&lt;/strong&gt; &#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;The implementation of aspects &lt;span target="T:PostSharp.Aspects.OnMethodBoundaryAspect" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/T_PostSharp_Aspects_OnMethodBoundaryAspect.htm"&gt;OnMethodBoundaryAspect&lt;/a&gt;&lt;/span&gt; and &lt;span target="T:PostSharp.Aspects.OnExceptionAspect" sdata="cer"&gt;&lt;a href="http://doc.sharpcrafters.com/postsharp-2.0/Content.aspx/PostSharp-2.0.chm/html/T_PostSharp_Aspects_OnExceptionAspect.htm"&gt;OnExceptionAspect&lt;/a&gt;&lt;/span&gt; is very efficient; they should be preferred over other aspects whenever it makes sense. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2341536.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/02/07/2341536.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/02/07/2341409.html</id><title type="text">AOP - PostSharp 2.0</title><summary type="text">PostSharp是一个非常优秀的AOP框架，使用上非常方便，功能强大，对目标拦截的方法不需要做什么修改，但现在已经商业化运作从PostSharp官方网站下载一个试用版，安装简单示例PostSharp采用Post-Compile的方式实现AOP，即对已经生成的程序集，按照拦截规则进行修改，对需要拦截的方法注入拦截代码。这种方式与基于动态代理的方式相比，没有过多限制，比如不需要目标方法为virtual类型或者实现了接口等1. 新建一个PostSharp.Test的Console测试项目添加引用: PostSharp、PostSharp.Laos2. 程序引用的命名空间using System;u</summary><published>2012-02-07T05:55:00Z</published><updated>2012-02-07T05:55:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/02/07/2341409.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/02/07/2341409.html"/><content type="html">PostSharp是一个非常优秀的AOP框架，使用上非常方便，功能强大，对目标拦截的方法不需要做什么修改，但现在已经商业化运作&lt;br /&gt;从&lt;a href="http://www.sharpcrafters.com/" target="_blank"&gt;&lt;font color="#003366"&gt;PostSharp官方网站&lt;/font&gt;&lt;/a&gt;下载一个试用版，安装&lt;br /&gt;&lt;br /&gt;&lt;strong style="font-size: 18pt"&gt;简单示例&lt;/strong&gt;&lt;br /&gt;PostSharp采用Post-Compile的方式实现AOP，即对已经生成的程序集，按照拦截规则进行修改，对需要拦截的方法注入拦截代码。这种方式与基于动态代理的方式相比，没有过多限制，比如不需要目标方法为virtual类型或者实现了接口等&lt;br /&gt;1. 新建一个PostSharp.Test的Console测试项目添加引用: PostSharp、PostSharp.Laos&lt;br /&gt;2. 程序引用的命名空间&lt;br /&gt;using System;&lt;br /&gt;using System.Reflection;&lt;br /&gt;using PostSharp.Laos;&lt;br /&gt;3. 测试用的代码如下: &#xD;
&lt;div&gt;&#xD;
&lt;div id="highlighter_936910" &gt;&#xD;
&lt;div &gt;&lt;span&gt;&lt;a  href="http://www.cnblogs.com/riccc/archive/2010/04/01/postsharp-demo.html#"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&#xD;
&lt;div &gt;1&lt;/div&gt;&#xD;
&lt;div &gt;2&lt;/div&gt;&#xD;
&lt;div &gt;3&lt;/div&gt;&#xD;
&lt;div &gt;4&lt;/div&gt;&#xD;
&lt;div &gt;5&lt;/div&gt;&#xD;
&lt;div &gt;6&lt;/div&gt;&#xD;
&lt;div &gt;7&lt;/div&gt;&#xD;
&lt;div &gt;8&lt;/div&gt;&#xD;
&lt;div &gt;9&lt;/div&gt;&#xD;
&lt;div &gt;10&lt;/div&gt;&#xD;
&lt;div &gt;11&lt;/div&gt;&#xD;
&lt;div &gt;12&lt;/div&gt;&#xD;
&lt;div &gt;13&lt;/div&gt;&#xD;
&lt;div &gt;14&lt;/div&gt;&#xD;
&lt;div &gt;15&lt;/div&gt;&#xD;
&lt;div &gt;16&lt;/div&gt;&#xD;
&lt;div &gt;17&lt;/div&gt;&#xD;
&lt;div &gt;18&lt;/div&gt;&#xD;
&lt;div &gt;19&lt;/div&gt;&#xD;
&lt;div &gt;20&lt;/div&gt;&#xD;
&lt;div &gt;21&lt;/div&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;private&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;static&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;void&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;SayHello(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;user, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;title) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Console.WriteLine(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.Format(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"Hello {0} {1}"&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;, title, user)); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;private&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;static&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;void&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;ThrowException() &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;throw&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;new&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;Exception(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"I'm a test message."&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;static&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;void&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;Main(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;[] args) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;SayHello(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"Richie"&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"Mr."&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;try&lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;ThrowException(); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;catch&lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Console.ReadKey(); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;return&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;4. 然后在项目中实现一个aspect: &#xD;
&lt;div&gt;&#xD;
&lt;div id="highlighter_403504" &gt;&#xD;
&lt;div &gt;&lt;span&gt;&lt;a  href="http://www.cnblogs.com/riccc/archive/2010/04/01/postsharp-demo.html#"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&#xD;
&lt;div &gt;1&lt;/div&gt;&#xD;
&lt;div &gt;2&lt;/div&gt;&#xD;
&lt;div &gt;3&lt;/div&gt;&#xD;
&lt;div &gt;4&lt;/div&gt;&#xD;
&lt;div &gt;5&lt;/div&gt;&#xD;
&lt;div &gt;6&lt;/div&gt;&#xD;
&lt;div &gt;7&lt;/div&gt;&#xD;
&lt;div &gt;8&lt;/div&gt;&#xD;
&lt;div &gt;9&lt;/div&gt;&#xD;
&lt;div &gt;10&lt;/div&gt;&#xD;
&lt;div &gt;11&lt;/div&gt;&#xD;
&lt;div &gt;12&lt;/div&gt;&#xD;
&lt;div &gt;13&lt;/div&gt;&#xD;
&lt;div &gt;14&lt;/div&gt;&#xD;
&lt;div &gt;15&lt;/div&gt;&#xD;
&lt;div &gt;16&lt;/div&gt;&#xD;
&lt;div &gt;17&lt;/div&gt;&#xD;
&lt;div &gt;18&lt;/div&gt;&#xD;
&lt;div &gt;19&lt;/div&gt;&#xD;
&lt;div &gt;20&lt;/div&gt;&#xD;
&lt;div &gt;21&lt;/div&gt;&#xD;
&lt;div &gt;22&lt;/div&gt;&#xD;
&lt;div &gt;23&lt;/div&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;[Serializable] &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;class&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;OnMyExceptionAspect : OnMethodBoundaryAspect &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;override&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;void&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;OnEntry(MethodExecutionEventArgs eventArgs) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;base&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.OnEntry(eventArgs); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Console.WriteLine(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.Format(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"Entering method: {0}"&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;, eventArgs.Method.Name)); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;object&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;[] arguments = eventArgs.GetReadOnlyArgumentArray(); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;ParameterInfo[] parameters = eventArgs.Method.GetParameters(); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;for&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;int&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;i = 0; arguments != &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;null&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;&amp;amp;&amp;amp; i &amp;lt; arguments.Length; i++) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Console.WriteLine(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.Format(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;" arg{0} {1}: {2}"&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;, i + 1, parameters[i].Name, arguments[i])); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;override&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;void&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;OnExit(MethodExecutionEventArgs eventArgs) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;base&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.OnExit(eventArgs); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Console.WriteLine(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.Format(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"Exiting method: {0}"&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;, eventArgs.Method.Name)); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;override&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;void&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;OnException(MethodExecutionEventArgs eventArgs) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Console.WriteLine(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"There's an error occured:"&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;+ eventArgs.Exception.Message); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;base&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.OnException(eventArgs); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;我们使用这个aspect对测试代码进行拦截处理，输出方法调用的日志信息&lt;br /&gt;5. 接下来的2个步骤就是设置项目，使得PostSharp在编译结束后能够对生成的程序集进行修改，假如拦截处理机制&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;a). 在项目中添加一个assembly指令，告诉PostSharp对哪些目标实施拦截&lt;br /&gt;[assembly: PostSharp.Test.OnMyExceptionAspect(&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;AttributeTargetAssemblies = "PostSharp.Test",&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;AttributeTargetTypes = "PostSharp.Test.Program")]&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;b). 修改项目文件，让PostSharp在编译完成后能够注入拦截代码:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;先通过VS的右键菜单卸载项目&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/riccc/frameworks/postsharp-demo-1.JPG" width="391" height="507" /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;然后通过VS邮件菜单编辑项目文件，添加一个import指令:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/riccc/frameworks/postsharp-demo-2.JPG" width="336" height="146" /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;在&amp;lt;Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /&amp;gt;后面添加一条import指令如下:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;Import Project="E:\Program Files\PostSharp 2.0\PostSharp.targets" /&amp;gt;&lt;br /&gt;6. 重新加载项目，编译，PostSharp就会在我们指定的位置上使用我们的OnMyExceptionAspect对Program的方法调用注入拦截代码，运行结果如下:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/riccc/frameworks/postsharp-demo-3.JPG" width="361" height="203" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong style="font-size: 18pt"&gt;使用Attribute方式&lt;/strong&gt;&lt;br /&gt;上面使用一个assembly指令告诉PostSharp应该对哪些方法实施拦截，OnMethodBoundaryAspect类已经继承了Attribute，因此我们可以通过给类或者方法添加Attribute的方式来代替assembly指令&lt;br /&gt;下面示例需要引用的命名空间:&lt;br /&gt;&#xD;
&lt;div&gt;using System;&lt;/div&gt;&#xD;
&lt;div&gt;using System.ComponentModel;&lt;/div&gt;&#xD;
&lt;div&gt;using System.Reflection;&lt;/div&gt;&#xD;
&lt;div&gt;using PostSharp.Extensibility;&lt;/div&gt;&#xD;
&lt;div&gt;using PostSharp.Laos;&lt;/div&gt;我们用下面的PropertyChangedNotificationAttribute来实现对象属性更改通知: &#xD;
&lt;div&gt;&#xD;
&lt;div id="highlighter_229090" &gt;&#xD;
&lt;div &gt;&lt;span&gt;&lt;a  href="http://www.cnblogs.com/riccc/archive/2010/04/01/postsharp-demo.html#"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&#xD;
&lt;div &gt;1&lt;/div&gt;&#xD;
&lt;div &gt;2&lt;/div&gt;&#xD;
&lt;div &gt;3&lt;/div&gt;&#xD;
&lt;div &gt;4&lt;/div&gt;&#xD;
&lt;div &gt;5&lt;/div&gt;&#xD;
&lt;div &gt;6&lt;/div&gt;&#xD;
&lt;div &gt;7&lt;/div&gt;&#xD;
&lt;div &gt;8&lt;/div&gt;&#xD;
&lt;div &gt;9&lt;/div&gt;&#xD;
&lt;div &gt;10&lt;/div&gt;&#xD;
&lt;div &gt;11&lt;/div&gt;&#xD;
&lt;div &gt;12&lt;/div&gt;&#xD;
&lt;div &gt;13&lt;/div&gt;&#xD;
&lt;div &gt;14&lt;/div&gt;&#xD;
&lt;div &gt;15&lt;/div&gt;&#xD;
&lt;div &gt;16&lt;/div&gt;&#xD;
&lt;div &gt;17&lt;/div&gt;&#xD;
&lt;div &gt;18&lt;/div&gt;&#xD;
&lt;div &gt;19&lt;/div&gt;&#xD;
&lt;div &gt;20&lt;/div&gt;&#xD;
&lt;div &gt;21&lt;/div&gt;&#xD;
&lt;div &gt;22&lt;/div&gt;&#xD;
&lt;div &gt;23&lt;/div&gt;&#xD;
&lt;div &gt;24&lt;/div&gt;&#xD;
&lt;div &gt;25&lt;/div&gt;&#xD;
&lt;div &gt;26&lt;/div&gt;&#xD;
&lt;div &gt;27&lt;/div&gt;&#xD;
&lt;div &gt;28&lt;/div&gt;&#xD;
&lt;div &gt;29&lt;/div&gt;&#xD;
&lt;div &gt;30&lt;/div&gt;&#xD;
&lt;div &gt;31&lt;/div&gt;&#xD;
&lt;div &gt;32&lt;/div&gt;&#xD;
&lt;div &gt;33&lt;/div&gt;&#xD;
&lt;div &gt;34&lt;/div&gt;&#xD;
&lt;div &gt;35&lt;/div&gt;&#xD;
&lt;div &gt;36&lt;/div&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;[Serializable] &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;[MulticastAttributeUsage(MulticastTargets.Method)] &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;class&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;PropertyChangedNotificationAttribute : OnMethodBoundaryAspect &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;private&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;object&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;_preValue; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;override&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;void&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;OnExit(MethodExecutionEventArgs eventArgs) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;base&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.OnExit(eventArgs); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;if&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;(!eventArgs.Method.IsSpecialName) &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;return&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;if&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;(!eventArgs.Method.Name.StartsWith(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"get_"&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;&amp;amp;&amp;amp; !eventArgs.Method.Name.StartsWith(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"set_"&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;)) &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;return&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;bool&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;isSetter = eventArgs.Method.Name.StartsWith(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"set_"&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;property = eventArgs.Method.Name.Substring(4); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;if&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;(isSetter) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Console.WriteLine(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.Format(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"Property \"{0}\" was changed from \"{1}\" to \"{2}\"."&lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;, property &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;this&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;._preValue &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;this&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.GetPropertyValue(eventArgs.Instance, property))); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;else&lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Console.WriteLine(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.Format(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"Property \"{0}\" was read."&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;, property)); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;override&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;void&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;OnEntry(MethodExecutionEventArgs eventArgs) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;base&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.OnEntry(eventArgs); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#878a85"&gt;//记录属性更改前的值 &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;if&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;(!eventArgs.Method.IsSpecialName) &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;return&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;if&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;(!eventArgs.Method.Name.StartsWith(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"set_"&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;)) &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;return&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;property = eventArgs.Method.Name.Substring(4); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;this&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;._preValue = &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;this&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.GetPropertyValue(eventArgs.Instance, property); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;private&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;object&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;GetPropertyValue(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;object&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;instance, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;property) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;PropertyInfo getter = instance.GetType().GetProperty(property); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;getter.GetValue(instance, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;null&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;然后给测试类添加PropertyChangedNotification的attribute就能通过AOP实现对象属性更改通知的效果: &#xD;
&lt;div&gt;&#xD;
&lt;div id="highlighter_611577" &gt;&#xD;
&lt;div &gt;&lt;span&gt;&lt;a  href="http://www.cnblogs.com/riccc/archive/2010/04/01/postsharp-demo.html#"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&#xD;
&lt;div &gt;1&lt;/div&gt;&#xD;
&lt;div &gt;2&lt;/div&gt;&#xD;
&lt;div &gt;3&lt;/div&gt;&#xD;
&lt;div &gt;4&lt;/div&gt;&#xD;
&lt;div &gt;5&lt;/div&gt;&#xD;
&lt;div &gt;6&lt;/div&gt;&#xD;
&lt;div &gt;7&lt;/div&gt;&#xD;
&lt;div &gt;8&lt;/div&gt;&#xD;
&lt;div &gt;9&lt;/div&gt;&#xD;
&lt;div &gt;10&lt;/div&gt;&#xD;
&lt;div &gt;11&lt;/div&gt;&#xD;
&lt;div &gt;12&lt;/div&gt;&#xD;
&lt;div &gt;13&lt;/div&gt;&#xD;
&lt;div &gt;14&lt;/div&gt;&#xD;
&lt;div &gt;15&lt;/div&gt;&#xD;
&lt;div &gt;16&lt;/div&gt;&#xD;
&lt;div &gt;17&lt;/div&gt;&#xD;
&lt;div &gt;18&lt;/div&gt;&#xD;
&lt;div &gt;19&lt;/div&gt;&#xD;
&lt;div &gt;20&lt;/div&gt;&#xD;
&lt;div &gt;21&lt;/div&gt;&#xD;
&lt;div &gt;22&lt;/div&gt;&#xD;
&lt;div &gt;23&lt;/div&gt;&#xD;
&lt;div &gt;24&lt;/div&gt;&#xD;
&lt;div &gt;25&lt;/div&gt;&#xD;
&lt;div &gt;26&lt;/div&gt;&#xD;
&lt;div &gt;27&lt;/div&gt;&#xD;
&lt;div &gt;28&lt;/div&gt;&#xD;
&lt;div &gt;29&lt;/div&gt;&#xD;
&lt;div &gt;30&lt;/div&gt;&#xD;
&lt;div &gt;31&lt;/div&gt;&#xD;
&lt;div &gt;32&lt;/div&gt;&#xD;
&lt;div &gt;33&lt;/div&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;[PropertyChangedNotification] &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;class&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;Person &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;private&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;firstName; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;private&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;lastName; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;Person(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;first, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;last) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;this&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.firstName = first; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;this&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.lastName = last; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;FirstName &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;get&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;firstName; } &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;set&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;{ firstName = value; } &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;LastName &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;get&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;lastName; } &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;set&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;{ lastName = value; } &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;Name &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;get&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;this&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.FirstName + &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;" "&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;+ &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;this&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.LastName; } &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;&amp;lt;BR&amp;gt; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;static&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;void&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;Main(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;[] args) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Person user = &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;new&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;Person(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"Richie"&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"Liu"&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;user.FirstName = &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"RicCC"&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Console.WriteLine(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.Format(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"{{ {0} {1} }}"&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;, user.FirstName, user.LastName)); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Console.ReadKey(); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;编译生成，运行结果如下:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/riccc/frameworks/postsharp-demo-4.JPG" width="468" height="143" /&gt;&lt;br /&gt;因为我们在Property的setter方法进入（OnEntry）时用反射读取了属性的值，记录修改之前的属性值；然后在setter方法结束（OnExit）时又使用反射去读取了修改之后的属性值，因此在***was changed from *** to ***这条消息之前，有2条属性的读取日志&lt;br /&gt;&lt;br /&gt;&lt;strong style="font-size: 18pt"&gt;Cache示例&lt;/strong&gt;&lt;br /&gt;PostSharp中有个缓存方法调用的示例：第一次调用方法的时候，执行这个方法，并把执行结果缓存起来；后面再调用这个方法时，就直接从缓存中取结果，让方法返回，而不执行方法体&lt;br /&gt;实现这一功能的aspect类如下: &#xD;
&lt;div&gt;&#xD;
&lt;div id="highlighter_291159" &gt;&#xD;
&lt;div &gt;&lt;span&gt;&lt;a  href="http://www.cnblogs.com/riccc/archive/2010/04/01/postsharp-demo.html#"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&#xD;
&lt;div &gt;1&lt;/div&gt;&#xD;
&lt;div &gt;2&lt;/div&gt;&#xD;
&lt;div &gt;3&lt;/div&gt;&#xD;
&lt;div &gt;4&lt;/div&gt;&#xD;
&lt;div &gt;5&lt;/div&gt;&#xD;
&lt;div &gt;6&lt;/div&gt;&#xD;
&lt;div &gt;7&lt;/div&gt;&#xD;
&lt;div &gt;8&lt;/div&gt;&#xD;
&lt;div &gt;9&lt;/div&gt;&#xD;
&lt;div &gt;10&lt;/div&gt;&#xD;
&lt;div &gt;11&lt;/div&gt;&#xD;
&lt;div &gt;12&lt;/div&gt;&#xD;
&lt;div &gt;13&lt;/div&gt;&#xD;
&lt;div &gt;14&lt;/div&gt;&#xD;
&lt;div &gt;15&lt;/div&gt;&#xD;
&lt;div &gt;16&lt;/div&gt;&#xD;
&lt;div &gt;17&lt;/div&gt;&#xD;
&lt;div &gt;18&lt;/div&gt;&#xD;
&lt;div &gt;19&lt;/div&gt;&#xD;
&lt;div &gt;20&lt;/div&gt;&#xD;
&lt;div &gt;21&lt;/div&gt;&#xD;
&lt;div &gt;22&lt;/div&gt;&#xD;
&lt;div &gt;23&lt;/div&gt;&#xD;
&lt;div &gt;24&lt;/div&gt;&#xD;
&lt;div &gt;25&lt;/div&gt;&#xD;
&lt;div &gt;26&lt;/div&gt;&#xD;
&lt;div &gt;27&lt;/div&gt;&#xD;
&lt;div &gt;28&lt;/div&gt;&#xD;
&lt;div &gt;29&lt;/div&gt;&#xD;
&lt;div &gt;30&lt;/div&gt;&#xD;
&lt;div &gt;31&lt;/div&gt;&#xD;
&lt;div &gt;32&lt;/div&gt;&#xD;
&lt;div &gt;33&lt;/div&gt;&#xD;
&lt;div &gt;34&lt;/div&gt;&#xD;
&lt;div &gt;35&lt;/div&gt;&#xD;
&lt;div &gt;36&lt;/div&gt;&#xD;
&lt;div &gt;37&lt;/div&gt;&#xD;
&lt;div &gt;38&lt;/div&gt;&#xD;
&lt;div &gt;39&lt;/div&gt;&#xD;
&lt;div &gt;40&lt;/div&gt;&#xD;
&lt;div &gt;41&lt;/div&gt;&#xD;
&lt;div &gt;42&lt;/div&gt;&#xD;
&lt;div &gt;43&lt;/div&gt;&#xD;
&lt;div &gt;44&lt;/div&gt;&#xD;
&lt;div &gt;45&lt;/div&gt;&#xD;
&lt;div &gt;46&lt;/div&gt;&#xD;
&lt;div &gt;47&lt;/div&gt;&#xD;
&lt;div &gt;48&lt;/div&gt;&#xD;
&lt;div &gt;49&lt;/div&gt;&#xD;
&lt;div &gt;50&lt;/div&gt;&#xD;
&lt;div &gt;51&lt;/div&gt;&#xD;
&lt;div &gt;52&lt;/div&gt;&#xD;
&lt;div &gt;53&lt;/div&gt;&#xD;
&lt;div &gt;54&lt;/div&gt;&#xD;
&lt;div &gt;55&lt;/div&gt;&#xD;
&lt;div &gt;56&lt;/div&gt;&#xD;
&lt;div &gt;57&lt;/div&gt;&#xD;
&lt;div &gt;58&lt;/div&gt;&#xD;
&lt;div &gt;59&lt;/div&gt;&#xD;
&lt;div &gt;60&lt;/div&gt;&#xD;
&lt;div &gt;61&lt;/div&gt;&#xD;
&lt;div &gt;62&lt;/div&gt;&#xD;
&lt;div &gt;63&lt;/div&gt;&#xD;
&lt;div &gt;64&lt;/div&gt;&#xD;
&lt;div &gt;65&lt;/div&gt;&#xD;
&lt;div &gt;66&lt;/div&gt;&#xD;
&lt;div &gt;67&lt;/div&gt;&#xD;
&lt;div &gt;68&lt;/div&gt;&#xD;
&lt;div &gt;69&lt;/div&gt;&#xD;
&lt;div &gt;70&lt;/div&gt;&#xD;
&lt;div &gt;71&lt;/div&gt;&#xD;
&lt;div &gt;72&lt;/div&gt;&#xD;
&lt;div &gt;73&lt;/div&gt;&#xD;
&lt;div &gt;74&lt;/div&gt;&#xD;
&lt;div &gt;75&lt;/div&gt;&#xD;
&lt;div &gt;76&lt;/div&gt;&#xD;
&lt;div &gt;77&lt;/div&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;[Serializable] &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;sealed&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;class&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;CacheAttribute : OnMethodBoundaryAspect &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#878a85"&gt;// 用来生成缓存的key值，key值中包含方法名、参数值等，因此参数不一时方法会被执行 &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;private&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;MethodFormatStrings formatStrings; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#878a85"&gt;// 用于缓存 &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;private&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;static&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;readonly&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;Dictionary&amp;lt;STRING, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;object&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;=&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;""&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;&amp;gt; cache = &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;new&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;Dictionary&amp;lt;STRING, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;object&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;=&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;""&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;&amp;gt;(); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;&amp;lt;BR&amp;gt; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#878a85"&gt;// 编译时刻执行的方法 &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#878a85"&gt;// Cache这个attribute用于方法上，某些方法不允许使用缓存，将在下面进行检查 &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;override&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;bool&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;CompileTimeValidate(MethodBase method) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#878a85"&gt;// Don't apply to constructors. &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;if&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;(method &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;is&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;ConstructorInfo) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Message.Write(SeverityType.Error, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"CX0001"&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"Cannot cache constructors."&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;false&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;MethodInfo methodInfo = (MethodInfo)method; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#878a85"&gt;// Don't apply to void methods. &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;if&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;(methodInfo.ReturnType.Name == &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"Void"&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Message.Write(SeverityType.Error, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"CX0002"&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"Cannot cache void methods."&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;false&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#878a85"&gt;// Does not support out parameters. &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;ParameterInfo[] parameters = method.GetParameters(); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;for&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;int&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;i = 0; i &amp;lt; parameters.Length; i++) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;if&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;(parameters[i].IsOut) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Message.Write(SeverityType.Error, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"CX0003"&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"Cannot cache methods with return values."&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;false&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;true&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#878a85"&gt;// 编译时刻执行的方法 &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;override&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;void&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;CompileTimeInitialize(MethodBase method, AspectInfo aspectInfo) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;this&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.formatStrings = Formatter.GetMethodFormatStrings(method); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;&amp;lt;BR&amp;gt; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;override&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;void&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;OnEntry(MethodExecutionArgs eventArgs) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#878a85"&gt;//生成缓存的key值 &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;key = &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;this&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;.formatStrings.Format( &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;eventArgs.Instance, eventArgs.Method, eventArgs.Arguments.ToArray()); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;lock&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;(cache) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;object&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;value; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#878a85"&gt;//查看是否存在缓存 &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;if&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;(!cache.TryGetValue(key, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;out&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;value)) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#878a85"&gt;// 缓存不存在，继续执行这个方法，并将key存在MethodExecutionTag，在执行完毕的 &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#878a85"&gt;// OnSuccess事件时使用key值将结果放到缓存中 &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;eventArgs.MethodExecutionTag = key; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;else&lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#878a85"&gt;// 已经在缓存中存在，则将执行的返回值直接设置为缓存中的值，不执行方法体而立即返回 &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;eventArgs.ReturnValue = value; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;eventArgs.FlowBehavior = FlowBehavior.Return; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;&amp;lt;BR&amp;gt; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#878a85"&gt;//这个事件只有在方法体被执行了，并且执行成功没有异常发生时才会触发 &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;override&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;void&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;OnSuccess(MethodExecutionArgs eventArgs) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#878a85"&gt;// 取得缓存的key值 &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;key = (&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;)eventArgs.MethodExecutionTag; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#878a85"&gt;// 把执行结果放入缓存中 &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;lock&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;(cache) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;cache[key] = eventArgs.ReturnValue; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;}&amp;lt;/STRING,&amp;gt;&amp;lt;/STRING,&amp;gt;&lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;测试代码如下: &#xD;
&lt;div&gt;&#xD;
&lt;div id="highlighter_992421" &gt;&#xD;
&lt;div &gt;&lt;span&gt;&lt;a  href="http://www.cnblogs.com/riccc/archive/2010/04/01/postsharp-demo.html#"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&#xD;
&lt;div &gt;1&lt;/div&gt;&#xD;
&lt;div &gt;2&lt;/div&gt;&#xD;
&lt;div &gt;3&lt;/div&gt;&#xD;
&lt;div &gt;4&lt;/div&gt;&#xD;
&lt;div &gt;5&lt;/div&gt;&#xD;
&lt;div &gt;6&lt;/div&gt;&#xD;
&lt;div &gt;7&lt;/div&gt;&#xD;
&lt;div &gt;8&lt;/div&gt;&#xD;
&lt;div &gt;9&lt;/div&gt;&#xD;
&lt;div &gt;10&lt;/div&gt;&#xD;
&lt;div &gt;11&lt;/div&gt;&#xD;
&lt;div &gt;12&lt;/div&gt;&#xD;
&lt;div &gt;13&lt;/div&gt;&#xD;
&lt;div &gt;14&lt;/div&gt;&#xD;
&lt;div &gt;15&lt;/div&gt;&#xD;
&lt;div &gt;16&lt;/div&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;static&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;void&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;Main( &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;[] args ) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Console.WriteLine( &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"1 -&amp;gt;"&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;+ GetDifficultResult( 1 ) ); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Console.WriteLine( &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"2 -&amp;gt;"&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;+ GetDifficultResult( 2 ) ); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Console.WriteLine( &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"1 -&amp;gt;"&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;+ GetDifficultResult( 1 ) ); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Console.WriteLine( &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"2 -&amp;gt;"&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;+ GetDifficultResult( 2 ) ); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Console.ReadKey(); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;} &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;[Cache] &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;private&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;static&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;int&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;GetDifficultResult( &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;int&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;arg ) &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#878a85"&gt;// 如果方法体被执行了，则会输出下面的消息，否则不会输出，说明使用了缓存 &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Console.WriteLine( &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"Some difficult work!"&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;Thread.Sleep( 1000 ); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;return&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;arg; &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;参数为1和2的时候分别执行以下方法体，后面2次调用则都是从缓存中直接取返回值了&lt;br /&gt;&lt;br /&gt;&lt;strong style="font-size: 18pt"&gt;DbInvoke示例&lt;/strong&gt;&lt;br /&gt;这也是PostSharp中一个比较有意思的示例，其工作方式大致如下，先使用下面代码声明一些方法:&lt;br /&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div id="highlighter_804439" &gt;&#xD;
&lt;div &gt;&lt;span&gt;&lt;a  href="http://www.cnblogs.com/riccc/archive/2010/04/01/postsharp-demo.html#"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&#xD;
&lt;div &gt;1&lt;/div&gt;&#xD;
&lt;div &gt;2&lt;/div&gt;&#xD;
&lt;div &gt;3&lt;/div&gt;&#xD;
&lt;div &gt;4&lt;/div&gt;&#xD;
&lt;div &gt;5&lt;/div&gt;&#xD;
&lt;div &gt;6&lt;/div&gt;&#xD;
&lt;div &gt;7&lt;/div&gt;&#xD;
&lt;div &gt;8&lt;/div&gt;&#xD;
&lt;div &gt;9&lt;/div&gt;&#xD;
&lt;div &gt;10&lt;/div&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;[DbInvoke(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ce638"&gt;"ConnectionString"&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;)] &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;internal&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;static&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;class&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;DataLayer &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;{ &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#435a5f"&gt;#pragma warning disable 626 &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;extern&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;static&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;void&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;CreateCustomer(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;customerName, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;out&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;int&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;customerId); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;extern&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;static&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;void&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;ModifyCustomer(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;int&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;customerId, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;customerName); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;extern&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;static&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;void&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;DeleteCustomer(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;int&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;customerId); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;extern&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;static&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;public&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;void&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;ReadCustomer(&lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;int&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;customerId, &lt;/font&gt;&lt;/code&gt;&lt;code &gt;&lt;font color="#5ba1cf"&gt;out&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#5ba1cf"&gt;string&lt;/font&gt;&lt;/code&gt; &lt;code &gt;&lt;font color="#b9bdb6"&gt;customerName); &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#435a5f"&gt;#pragma warning restore 626 &lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;font color="#b9bdb6"&gt;}&lt;/font&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;这里每个方法代表一个数据库的存储过程，通过DbInvoke这个attribute实施拦截（DbInvoke继承自PostSharp.Aspects.ImplementMethodAspect，PostSharp直接使用这个类的OnExecution方法代替对原方法的调用，他用于实现对extern方法、abstract类的方法提供拦截实现），然后将方法名作为存储过程名字，参数名字则作为存储过程参数名，将.NET数据类型转化为数据库的数据类型，执行存储过程，并处理out、ref类型的参数，将存储过程执行结果的参数值设置到方法的相关参数上&lt;br /&gt;通过这样的方式，将数据库的存储过程声明为.NET中的extern方法，简化对存储过程的调用方式&lt;br /&gt;&lt;br /&gt;&lt;strong style="font-size: 18pt"&gt;Aspect的类型&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;1.&amp;nbsp;OnMethodBoundaryAspect&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;可以override OnEntry、OnExit、OnSuccess、OnException等方法实施拦截，可以读取入参，修改ref、out类型的入参，决定是否调用被拦截的方法体，以及读取、修改方法的返回值等，一般可以用于自己编写的assembly，进行日志记录等操作&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;PostSharp对原方法注入一个try{}catch(){}语句，在适当的位置注入各个拦截事件的调用代码&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;当对同一个方法使用多个该类型的aspect时，可以通过设置或者实现AspectPriority来确定各个拦截器的执行顺序&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;类似于前面的Cache示例中使用到的，在aspect之间或者拦截的各个方法之间，可以通过MethodExecutionEventArgs的MethodExecutionTag属性来传递必要的状态信息&lt;br /&gt;&lt;strong&gt;2.&amp;nbsp;OnExceptionAspect&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;用于实现异常捕获，可以运用于第三方开发的，没有源代码的assembly上&lt;br /&gt;&lt;strong&gt;3.&amp;nbsp;OnFieldAccessAspect&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;方便对field的读取、设置进行拦截处理，override&amp;nbsp;OnGetValue、OnSetValue方法实施拦截。测试过程中无法读取到FieldInfo属性，不知道是不是只有商业版注册后才可以使用这个功能&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;对field访问的拦截只能适用于当前程序集，如果其他程序集直接诶访问field无法实现拦截，所以对于public、protected类型的field，PostSharp会将field重命名，然后自动生成一个原field名字的property，这会导致依赖的程序集二进制兼容性被破坏，需要重新编译。这个行为也可以通过选项进行配置，阻止PostSharp这样做&lt;br /&gt;&lt;strong&gt;4.&amp;nbsp;OnMethodInvocationAspect&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;override OnInvocation方法实施拦截，PostSharp不是直接修改注入目标程序集，而是为目标方法生成一个委托，修改当前程序集中的调用，改为调用委托，从而实现拦截（这种方式叫做Call-site weaving，调用方织入，对应的另一种方式叫做Target-site weaving，目标织入）。这种方式可以实现对第三方程序集方法实施拦截&lt;br /&gt;&lt;strong&gt;5.&amp;nbsp;ImplementMethodAspect&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;如前面的DbInvoke示例，这个aspect用于extern方法、abstract类的方法进行拦截，不要求目标方法有具体的实现&lt;br /&gt;&lt;br /&gt;&lt;strong style="font-size: 18pt"&gt;Aspect的生命周期&lt;/strong&gt;&lt;br /&gt;aspect在编译期实例化，PostSharp将aspect的实例序列化存到assembly中，在运行时再反序列化回来&lt;br /&gt;对multicast类型的attribute，PostSharp会为每个匹配到的类型、方法等单独创建一个该attribute的实例对象应用于目标上&lt;br /&gt;multicast概念：本来我们写一个custom attribute，必须在每个需要运用的方法、类型上面使用这个attribute，PostSharp中的multicast指可以指定比较宽的一个范围，或者使用正则表达式以及一些filter等，将这个attribute应用到匹配到的多个目标对象上面去，类似于多播这样的效果。这就是在前面使用过的assembly指令&lt;br /&gt;这个概念导致的一个结果，对于理解PostSharp的行为比较重要，如果某个multicast类型的attribute指定为作用于field，但又将这个attribute设置在了type上面，则PostSharp会为该type的所有field运用这个attribute，从而运用拦截处理&lt;br /&gt;&lt;br /&gt;另外，PostSharp的示例Advanced\AssemblyExplorer项目演示了如何使用PostSharp的CodeModel。PostSharp没有使用Mono.Cecil和CCI等开源项目，而是建立了自己的CodeModel来分析和修改assembly的元数据以及IL代码等，通过这个示例可以大致了解如何使用PostSharp的CodeModel来实现某些元数据、IL层面的操作&lt;br /&gt;&lt;br /&gt;参考：&lt;br /&gt;&lt;a href="http://www.codeproject.com/KB/codegen/AOP101.aspx" target="_blank"&gt;&lt;font color="#003366"&gt;Aspect Oriented Programming 101&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeproject.com/KB/cs/NotifyingAttribute.aspx" target="_blank"&gt;&lt;font color="#003366"&gt;AOP Implementation of INotifyPropertyChanged&lt;/font&gt;&lt;/a&gt;&lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2341409.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/02/07/2341409.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/02/06/2340334.html</id><title type="text">给Editplus去掉.bak文件</title><summary type="text">editplus应该不算一个集成环境，而是一个功能强悍的文本编辑器。我经常用它来查看代码（少量的编辑），它个子小，速度超快，用的很是舒心。但是为什么我以前一直不愿意用它来编辑文件呢，没有自动提示功能算是一个，还有就是在保存文件后，它会生成有个.bak的备份文件。而我在大部分时间都用不到这个功能。曾几何时， 我试图因为这个原因想找一款和editplus(还有一款UItraEdit也不错，但同样生成.bak文件)一样棒，但保存时不生成.bak文件的编辑器，结果当然是没找到。今天在研究maven的时候，也遇到这样的问题，于是索性看看，有没有人也抱怨这个问题。google一把，果然很多人遇到这个问题，</summary><published>2012-02-06T08:25:00Z</published><updated>2012-02-06T08:25:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/02/06/2340334.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/02/06/2340334.html"/><content type="html">editplus应该不算一个集成环境，而是一个功能强悍的文本编辑器。我经常用它来查看代码（少量的编辑），它个子小，速度超快，用的很是舒心。但是为什么我以前一直不愿意用它来编辑文件呢，没有自动提示功能算是一个，还有就是在保存文件后，它会生成有个.bak的备份文件。而我在大部分时间都用不到这个功能。曾几何时， 我试图因为这个原因想找一款和editplus(还有一款UItraEdit也不错，但同样生成.bak文件)一样棒，但保存时不生成.bak文件的编辑器，结果当然是没找到。今天在研究maven的时候，也遇到这样的问题，于是索性看看，有没有人也抱怨这个问题。google一把，果然很多人遇到这个问题，但是解决办法也是非常的简单的要把我雷倒，如下菜单开始照做 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tools--&amp;gt;Configure User Tools--&amp;gt;Files--&amp;gt;去掉create bacup file when saving前复选框的对号。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ok,当你这样做完以后，就算是搞定了。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;原来生不生成backup文件是可以设置的，自己以前不注意研究这款软件，弄得自己都要笑自己了。可惜软件默认生成备份文件本是好心，却给很多人带来麻烦。因为很多人都有自己的备份方案，editplus的.bak对于像我这样的人来说却成了鸡肋。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;技巧应用： &lt;br /&gt;&lt;br /&gt;1.让editplus写html时使用小写字母表示。 &lt;br /&gt;&lt;br /&gt;editplus写html时候默认是大写。不知道编写此软件的人是怎么想的，难道是为了别具一格。反正看了就不舒服。原本认为只能忍受了。结果今天在网上一搜，又有好的办法解决。还是editplus自己的功能，废话不多说，方法如下 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tools--&amp;gt;Configure User Tools--&amp;gt;General--&amp;gt;勾选HTML tag in lower case &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在新建一个html，就会有比较欣喜的预期结果。 &lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2340334.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/02/06/2340334.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/02/03/2337242.html</id><title type="text">大型JavaScript应用程序架构模式</title><summary type="text">http://www.cnblogs.com/TomXu/archive/2011/12/14/2286225.html</summary><published>2012-02-03T08:09:00Z</published><updated>2012-02-03T08:09:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/02/03/2337242.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/02/03/2337242.html"/><content type="html">&lt;a href="http://www.cnblogs.com/TomXu/archive/2011/12/14/2286225.html"&gt;http://www.cnblogs.com/TomXu/archive/2011/12/14/2286225.html&lt;/a&gt;&lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2337242.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/02/03/2337242.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/02/02/2335799.html</id><title type="text">svn学习总结</title><summary type="text">visual studio 编译前自动svn更新TortoiseProc.exe /command:update /path:$(ProjectDir) /closeonend:0</summary><published>2012-02-02T07:02:00Z</published><updated>2012-02-02T07:02:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/02/02/2335799.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/02/02/2335799.html"/><content type="html">&lt;p&gt;visual studio 编译前自动svn更新&lt;/p&gt;&#xD;
&lt;p&gt;TortoiseProc.exe /command:update /path:$(ProjectDir)&amp;nbsp;&amp;nbsp;&amp;nbsp; /closeonend:0&lt;/p&gt;&lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2335799.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/02/02/2335799.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/01/31/2333732.html</id><title type="text">jquery easyui 学习总结</title><summary type="text">1.分页查询条件var query={keywords:&amp;#39;your keywords&amp;#39;,id:&amp;#39;your id&amp;#39;}; //把查询条件拼接成JSON$(&amp;quot;#test&amp;quot;).datagrid(&amp;#39;options&amp;#39;).queryParams=query; //把查询条件赋值给datagrid内部变量$(&amp;quot;#test&amp;quot;).datagrid(&amp;#39;reload&amp;#39;); //重新加载2.</summary><published>2012-01-31T08:38:00Z</published><updated>2012-01-31T08:38:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/01/31/2333732.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/01/31/2333732.html"/><content type="html">&lt;p&gt;1.分页查询条件&lt;/p&gt;&#xD;
&lt;p&gt;var query={keywords:'your keywords',id:'your id'}; //把查询条件拼接成JSON&lt;br /&gt;$("#test").datagrid('options').queryParams=query; //把查询条件赋值给datagrid内部变量&lt;br /&gt;$("#test").datagrid('reload'); //重新加载&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2333732.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/01/31/2333732.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/01/31/2332719.html</id><title type="text">js事件处理</title><summary type="text">var EventUtil = {//建新对象 addHandler:function(element,type,func){//添加事件 if(element.addEventListener){ element.addEventListener(type,func,false); }else if(element.attachEvent){ element.attachEvent(&amp;quot;on&amp;quot;+ type,func); }else{ element[&amp;quot;on&amp;quot;+ type] = func; } }, getEvent:function(event){//获</summary><published>2012-01-31T03:08:00Z</published><updated>2012-01-31T03:08:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/01/31/2332719.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/01/31/2332719.html"/><content type="html">&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; EventUtil = {&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;建新对象&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; addHandler:&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(element,type,func){&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;添加事件&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(element.addEventListener){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; element.addEventListener(type,func,&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(element.attachEvent){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; element.attachEvent("on"+ type,func);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; element["on"+ type] = func;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; getEvent:&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(event){&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;获取Event对象&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; event?event:window.event;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; getTarget:&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(event){&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;获得事件目标&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; event.target || event.srcElement;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; preventDefault:&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(event){&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;阻止事件的默认行为&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(event.preventDefault){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; event.preventDefault();&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;非IE&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; event.returnValue = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;IE&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; removeHandler:&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(element,type,func){&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;取消事件&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(element.removeEventListener){&lt;br /&gt;element.removeEventListener(type,func,&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;span style="color: #0000ff"&gt;else&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(element.detachEvent){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; element.detachEvent("on"+ type,func);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; element["on"+ type] = &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stopPropagation:&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(event){&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;取消事件的冒泡&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(event.stopPropagation){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; event.stopPropagation();&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;非IE&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; event.cancelBubble = &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;IE&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2332719.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/01/31/2332719.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
