﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Timothy&#039;s Space &#187; Extention</title>
	<atom:link href="http://www.xiaozhou.net/tag/extention/feed" rel="self" type="application/rss+xml" />
	<link>http://www.xiaozhou.net</link>
	<description>君看一叶舟，出没风波里</description>
	<lastBuildDate>Tue, 07 Feb 2012 04:28:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>扩展方法收集–实体验证</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/extention_method_entity_validation-2010-01-17.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/extention_method_entity_validation-2010-01-17.htm#comments</comments>
		<pubDate>Sun, 17 Jan 2010 14:31:00 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[Entity]]></category>
		<category><![CDATA[Extention]]></category>
		<category><![CDATA[Method]]></category>
		<category><![CDATA[Validation]]></category>
		<category><![CDATA[实体]]></category>
		<category><![CDATA[扩展方法]]></category>
		<category><![CDATA[收集]]></category>
		<category><![CDATA[验证]]></category>

		<guid isPermaLink="false">http://www.xiaozhou.net/dotnetdevelopment/%e6%89%a9%e5%b1%95%e6%96%b9%e6%b3%95%e6%94%b6%e9%9b%86-%e5%ae%9e%e4%bd%93%e9%aa%8c%e8%af%81-2010-01-17.htm</guid>
		<description><![CDATA[关于实体验证，是早期在博客园看到一个同学的文章，里面利用扩展方法对实体进行验证的思路比较有创意。大家可以先跳过去先看一下：http://www.cnblogs.com/tristanguo/archive/2009/05/15/1457197.html 这个实体验证的扩展方法，设计比较巧妙，充分利用了链式编程的特点，让代码更加简洁和美观，唯一不足的地方是后来作者在改进的时候感觉不是很到位。于是偶的同事Rex同学，对这实体验证的扩展方法进行了改进，在我看来，应该算是比较完美的解决方法了，因此在我们的实际项目中，也比较大量的应用到了此扩展方法。在这里贴出来，给大家分享一下。 贴代码： ?View Code CSHARP1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 [...]]]></description>
			<content:encoded><![CDATA[<p>关于实体验证，是早期在博客园看到一个同学的文章，里面利用扩展方法对实体进行验证的思路比较有创意。大家可以先跳过去先看一下：<a href="http://www.cnblogs.com/tristanguo/archive/2009/05/15/1457197.html">http://www.cnblogs.com/tristanguo/archive/2009/05/15/1457197.html</a><br />
这个实体验证的扩展方法，设计比较巧妙，充分利用了链式编程的特点，让代码更加简洁和美观，唯一不足的地方是后来作者在改进的时候感觉不是很到位。于是偶的同事<a href="http://xzwplus.cnblogs.com/" target="_blank">Rex</a>同学，对这实体验证的扩展方法进行了改进，在我看来，应该算是比较完美的解决方法了，因此在我们的实际项目中，也比较大量的应用到了此扩展方法。在这里贴出来，给大家分享一下。<br />
贴代码：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p498code3'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4983"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
</pre></td><td class="code" id="p498code3"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Collections.Generic</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Linq</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Text</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> CommonLib
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">class</span> EntityValidator
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> ValidateResult Validate<span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span> T target,
                                              Predicate predicate,
                                              <span style="color: #6666cc; font-weight: bold;">string</span> errorMessage<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            var result <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> ValidateResult<span style="color: #008000;">&#40;</span>target<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">!</span>predicate<span style="color: #008000;">&#40;</span>target<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                result<span style="color: #008000;">.</span><span style="color: #0000FF;">Errors</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>errorMessage<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">return</span> result<span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> ValidateResult Validate<span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span> ValidateResult target,
                                              Predicate predicate,
                                              <span style="color: #6666cc; font-weight: bold;">string</span> errorMessage<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">!</span>predicate<span style="color: #008000;">&#40;</span>target<span style="color: #008000;">.</span><span style="color: #0000FF;">Entity</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                target<span style="color: #008000;">.</span><span style="color: #0000FF;">Errors</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>errorMessage<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">return</span> target<span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> ValidateResult
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">internal</span> List Errors <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #0600FF; font-weight: bold;">internal</span> T Entity <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> <span style="color: #0600FF; font-weight: bold;">private</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">bool</span> HasErrors
        <span style="color: #008000;">&#123;</span>
            get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> Errors<span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span> <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">internal</span> ValidateResult<span style="color: #008000;">&#40;</span>T entity<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Errors <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> List<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            Entity <span style="color: #008000;">=</span> entity<span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> ErrorMessages <span style="color: #008000;">&#123;</span> get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> Errors<span style="color: #008000;">.</span><span style="color: #0000FF;">ToArray</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span> <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>有了这个实体验证的方法，代码可以简洁多了，并且再也不用在业务逻辑判断中，写入复杂的if…else语句块，取而代之的代码，示例如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p498code4'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4984"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p498code4"><pre class="csharp" style="font-family:monospace;">ValidateResult validateResult <span style="color: #008000;">=</span>
                        content<span style="color: #008000;">.</span><span style="color: #0000FF;">Validate</span><span style="color: #008000;">&#40;</span>c <span style="color: #008000;">=&gt;</span> <span style="color: #008000;">!</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">.</span><span style="color: #0000FF;">IsNullOrEmpty</span><span style="color: #008000;">&#40;</span>c<span style="color: #008000;">.</span><span style="color: #0000FF;">Name</span><span style="color: #008000;">&#41;</span>, <span style="color: #666666;">&quot;Name为空&quot;</span><span style="color: #008000;">&#41;</span>
                               <span style="color: #008000;">.</span><span style="color: #0000FF;">Validate</span><span style="color: #008000;">&#40;</span>c <span style="color: #008000;">=&gt;</span> c<span style="color: #008000;">.</span><span style="color: #0000FF;">MobilePhone</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">11</span> , <span style="color: #666666;">&quot;MobilePhone长度不正确&quot;</span><span style="color: #008000;">&#41;</span>
                               <span style="color: #008000;">.</span><span style="color: #0000FF;">Validate</span><span style="color: #008000;">&#40;</span>c <span style="color: #008000;">=&gt;</span> c<span style="color: #008000;">.</span><span style="color: #0000FF;">Age</span> <span style="color: #008000;">&gt;=</span> <span style="color: #FF0000;">10</span><span style="color: #008000;">&#41;</span>, <span style="color: #666666;">&quot;年龄不在规定范围&quot;</span><span style="color: #008000;">&#41;</span>
                               <span style="color: #008000;">.</span><span style="color: #0000FF;">Validate</span><span style="color: #008000;">&#40;</span>c <span style="color: #008000;">=&gt;</span> c<span style="color: #008000;">.</span><span style="color: #0000FF;">Height</span> <span style="color: #008000;">&lt;=</span> <span style="color: #FF0000;">200</span> <span style="color: #008000;">&amp;&amp;</span> c<span style="color: #008000;">.</span><span style="color: #0000FF;">Height</span> <span style="color: #008000;">&gt;=</span> <span style="color: #FF0000;">180</span>, <span style="color: #666666;">&quot;身高不符合标准&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>validateResult<span style="color: #008000;">.</span><span style="color: #0000FF;">HasErrors</span><span style="color: #008000;">&#41;</span>
                    <span style="color: #008000;">&#123;</span>
                        log<span style="color: #008000;">.</span><span style="color: #0000FF;">Info</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;实体验证失败:&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                        validateResult<span style="color: #008000;">.</span><span style="color: #0000FF;">ErrorMessages</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">ForEach</span><span style="color: #008000;">&#40;</span>p <span style="color: #008000;">=&gt;</span> log<span style="color: #008000;">.</span><span style="color: #0000FF;">Info</span><span style="color: #008000;">&#40;</span>p<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                        <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">;</span>
                    <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>怎么样？这样的链式编程的代码，比起一大串的if…else组合语句，简洁、明了多了，并且还可以提高代码阅读的效率，强烈推荐各位同学使用。</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/extention_method_entity_validation-2010-01-17.htm/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>[置顶]常用扩展方法收集&amp;整理(置顶-不断更新)</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/common_used_extention_method-2009-11-14.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/common_used_extention_method-2009-11-14.htm#comments</comments>
		<pubDate>Fri, 13 Nov 2009 16:33:00 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Extention]]></category>
		<category><![CDATA[Method]]></category>
		<category><![CDATA[扩展方法]]></category>
		<category><![CDATA[收集]]></category>
		<category><![CDATA[整理]]></category>

		<guid isPermaLink="false">http://www.xiaozhou.net/dotnetdevelopment/%e5%b8%b8%e7%94%a8%e6%89%a9%e5%b1%95%e6%96%b9%e6%b3%95%e6%94%b6%e9%9b%86%e6%95%b4%e7%90%86-%e4%b8%80-2009-11-14.htm</guid>
		<description><![CDATA[常用的扩展方法收集与整理。]]></description>
			<content:encoded><![CDATA[<p>扩展方法，是.NET 3.5中引入的新特性，在<a href="http://www.xiaozhou.net/dotnetdevelopment/extension-method-uses-summary-2009-09-28.htm" target="_blank">《扩展方法使用小结中》</a>，我有具体的介绍。合理的使用扩展方法，能节约不少的代码量，甚至能在开发中给我们带来意想不到的效果，让代码更加的简洁、易懂。其实，网上早就有了不少的大牛写的各种出色的扩展方法，以至于我有了整理一个扩展方法库的想法，把一些实用、优秀的扩展方法收集起来，一来为资源共享，二来也是为了应用在以后的项目代码中，提高开发效率。<span id="more-389"></span></p>
<p>1.Foreach方法<br />
首先上场的是Foreach，在使用Linq的时候，太容易派上用场了。比如，在使用Linq to Sql查询后，我们常常需要遍历结果，然后输出，代码如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p389code5'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p3895"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p389code5"><pre class="csharp" style="font-family:monospace;">DataClassDataContext ctx <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> DataClassDataContext<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
var result <span style="color: #008000;">=</span> ctx<span style="color: #008000;">.</span><span style="color: #0000FF;">Products</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>p <span style="color: #008000;">=&gt;</span> p<span style="color: #008000;">.</span><span style="color: #0000FF;">ProductID</span> <span style="color: #008000;">&gt;=</span> <span style="color: #FF0000;">10</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>var product <span style="color: #0600FF; font-weight: bold;">in</span> result<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>product<span style="color: #008000;">.</span><span style="color: #0000FF;">ProductName</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>自从有了Foreach，可以节省不少的力气了：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p389code6'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p3896"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p389code6"><pre class="csharp" style="font-family:monospace;">DataClassDataContext ctx <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> DataClassDataContext<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
ctx<span style="color: #008000;">.</span><span style="color: #0000FF;">Products</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>p <span style="color: #008000;">=&gt;</span> p<span style="color: #008000;">.</span><span style="color: #0000FF;">ProductID</span> <span style="color: #008000;">&gt;=</span> <span style="color: #FF0000;">10</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">ForEach</span><span style="color: #008000;">&#40;</span>p <span style="color: #008000;">=&gt;</span> Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>p<span style="color: #008000;">.</span><span style="color: #0000FF;">ProductName</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></td></tr></table></div>

<p>Foreach代码如下:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p389code7'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p3897"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p389code7"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> <span style="color: #0600FF; font-weight: bold;">ForEach</span> <span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span> IEnumerable source, Action action<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">foreach</span><span style="color: #008000;">&#40;</span>var item <span style="color: #0600FF; font-weight: bold;">in</span> source<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            action<span style="color: #008000;">&#40;</span>item<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>2.In方法<br />
判断某个类型的变量是否在一个序列中</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p389code8'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p3898"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p389code8"><pre class="csharp" style="font-family:monospace;"><span style="color: #6666cc; font-weight: bold;">string</span> <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> names <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#123;</span><span style="color: #666666;">&quot;Andy&quot;</span>, <span style="color: #666666;">&quot;Timothy&quot;</span>, <span style="color: #666666;">&quot;Ben&quot;</span>, <span style="color: #666666;">&quot;Rex&quot;</span>, <span style="color: #666666;">&quot;Ven&quot;</span>, <span style="color: #666666;">&quot;Ken&quot;</span><span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">if</span><span style="color: #008000;">&#40;</span>names<span style="color: #008000;">.</span><span style="color: #0000FF;">Contains</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Timothy&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Found!&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>使用In方法:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p389code9'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p3899"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p389code9"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Timothy&quot;</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">In</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Andy&quot;</span>, <span style="color: #666666;">&quot;Timothy&quot;</span>, <span style="color: #666666;">&quot;Ben&quot;</span>, <span style="color: #666666;">&quot;Rex&quot;</span>, <span style="color: #666666;">&quot;Ven&quot;</span>, <span style="color: #666666;">&quot;Ken&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Found!&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>In方法代码如下:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p389code10'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38910"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p389code10"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">bool</span> <span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span> T t, <span style="color: #0600FF; font-weight: bold;">params</span> T<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> c<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">return</span> c<span style="color: #008000;">.</span><span style="color: #0000FF;">Contains</span><span style="color: #008000;">&#40;</span>t<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>3.WinForm下的控件选择器(摘自 博客园-鹤冲天 的博客 http://www.cnblogs.com/ldp615/archive/2009/11/08/1598596.html)</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p389code11'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38911"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p389code11"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> IEnumerable GetControls<span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span> Control control, Func filter<span style="color: #008000;">&#41;</span> <span style="color: #0600FF; font-weight: bold;">where</span> T <span style="color: #008000;">:</span> Control
<span style="color: #008000;">&#123;</span>
	<span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>Control c <span style="color: #0600FF; font-weight: bold;">in</span> control<span style="color: #008000;">.</span><span style="color: #0000FF;">Controls</span><span style="color: #008000;">&#41;</span>
 	<span style="color: #008000;">&#123;</span>
		<span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>c <a href="http://www.google.com/search?q=is+msdn.microsoft.com"><span style="color: #008000;">is</span></a> T<span style="color: #008000;">&amp;&amp;</span><span style="color: #008000;">&#40;</span>filter <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">||</span>filter<span style="color: #008000;">&#40;</span>c <span style="color: #0600FF; font-weight: bold;">as</span> T<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
 			<span style="color: #0600FF; font-weight: bold;">yield</span> <span style="color: #0600FF; font-weight: bold;">return</span> c <span style="color: #0600FF; font-weight: bold;">as</span> T<span style="color: #008000;">;</span>
 		<span style="color: #008000;">&#125;</span>
 		<span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>T _t <span style="color: #0600FF; font-weight: bold;">in</span> GetControls<span style="color: #008000;">&#40;</span>c, filter<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
 		<span style="color: #0600FF; font-weight: bold;">yield</span> <span style="color: #0600FF; font-weight: bold;">return</span> _t<span style="color: #008000;">;</span>
 	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>使用方法：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p389code12'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38912"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p389code12"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">GetControls</span><span style="color: #008000;">&lt;</span>button<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">ForEach</span><span style="color: #008000;">&#40;</span>b <span style="color: #008000;">=&gt;</span> b<span style="color: #008000;">.</span><span style="color: #0000FF;">Enabled</span> <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>  <span style="color: #008080; font-style: italic;">//禁用界面上所有Button控件</span>
<span style="color: #008000;">&lt;/</span>button<span style="color: #008000;">&gt;</span></pre></td></tr></table></div>

<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/common_used_extention_method-2009-11-14.htm/feed</wfw:commentRss>
		<slash:comments>38</slash:comments>
		</item>
		<item>
		<title>扩展方法使用小结</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/extension-method-uses-summary-2009-09-28.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/extension-method-uses-summary-2009-09-28.htm#comments</comments>
		<pubDate>Mon, 28 Sep 2009 15:24:42 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[Extention]]></category>
		<category><![CDATA[Method]]></category>
		<category><![CDATA[使用]]></category>
		<category><![CDATA[扩展方法]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=245</guid>
		<description><![CDATA[随着.Net Framework一路走来，已经让广大开发人员体验到快速开发的甜头，这得益于.Net Framework为我们提供了更高层次的封装，开发人员不必关心底层的Win32 API及其繁琐的调用参数，而可以把大部分的经历放在对业务的分析和实现。随着.Net的不断革新，也引入了更多的特性，例如C# 2.0，就增加了匿名方法和迭代器，这些特性让我们的编码效率更高。随着C# 3.0的推出，引入了更多的新特性，包括：隐式类型局部变量、对象初始化器、Lambda表达式、扩展方法、匿名类型。 而这些特性，都为LINQ的推出，构建好了基础。其中一个比较不错的特性，就是扩展方法。扩展方法，顾名思义，就是在类型定义完成之后，再继续为其添加新的方法。这是相当方便的，比如对于一个已经封装好的Assembly来说，我们不用改动Assembly的代码，而通过扩展方法就能实现对其功能的扩展，而且在调用的时候，仅仅通过代码，你几乎判断不出这是扩展方法，还是Assembly本身的方法。 扩展方法在.Net 3.5中的应用也是非常普遍的，如果你仔细观察，就会发现我们常用的Linq to Object中的Where,Select,Average,Sum等方法，以及Linq to SQL中的Where,Select,Average,Sum等方法，其实都是扩展方法，他们分别定义于System.Linq.Enumerable类和System.Linq.Queryable类之中。 就扩展方法本身而言，也存在一些限制之处。对于编译器来说，如果扩展方法和被扩展类型的方法发生冲突的时候，在调用此方法的时候，究竟是调用被扩展类型的方法，还是扩展方法呢？通过一个例子，我们就能发现其中的区别。 1: class Program 2: { 3: static void Main(string[] args) 4: { 5: new TestClassA().Display("Test"); 6: new TestClassB().Display("Test"); 7: Console.ReadLine(); 8: } 9: } 10: 11: class TestClassA 12: { 13: public void Display(int b) 14: { 15: Console.WriteLine("This is TestClassA.Display() [...]]]></description>
			<content:encoded><![CDATA[<p>随着.Net Framework一路走来，已经让广大开发人员体验到快速开发的甜头，这得益于.Net Framework为我们提供了更高层次的封装，开发人员不必关心底层的Win32 API及其繁琐的调用参数，而可以把大部分的经历放在对业务的分析和实现。随着.Net的不断革新，也引入了更多的特性，例如C# 2.0，就增加了匿名方法和迭代器，这些特性让我们的编码效率更高。随着C# 3.0的推出，引入了更多的新特性，包括：隐式类型局部变量、对象初始化器、Lambda表达式、扩展方法、匿名类型。</p>
<p>而这些特性，都为LINQ的推出，构建好了基础。其中一个比较不错的特性，就是扩展方法。扩展方法，顾名思义，就是在类型定义完成之后，再继续为其添加新的方法。这是相当方便的，比如对于一个已经封装好的Assembly来说，我们不用改动Assembly的代码，而通过扩展方法就能实现对其功能的扩展，而且在调用的时候，仅仅通过代码，你几乎判断不出这是扩展方法，还是Assembly本身的方法。</p>
<p>扩展方法在.Net 3.5中的应用也是非常普遍的，如果你仔细观察，就会发现我们常用的Linq to Object中的Where,Select,Average,Sum等方法，以及Linq to SQL中的Where,Select,Average,Sum等方法，其实都是扩展方法，他们分别定义于System.Linq.Enumerable类和System.Linq.Queryable类之中。</p>
<p>就扩展方法本身而言，也存在一些限制之处。对于编译器来说，如果扩展方法和被扩展类型的方法发生冲突的时候，在调用此方法的时候，究竟是调用被扩展类型的方法，还是扩展方法呢？通过一个例子，我们就能发现其中的区别。</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>  <span class="kwrd">class</span> Program</pre>
<pre><span class="lnum">   2:  </span>    {</pre>
<pre class="alt"><span class="lnum">   3:  </span>        <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)</pre>
<pre><span class="lnum">   4:  </span>        {</pre>
<pre class="alt"><span class="lnum">   5:  </span>            <span class="kwrd">new</span> TestClassA().Display(<span class="str">"Test"</span>);</pre>
<pre><span class="lnum">   6:  </span>            <span class="kwrd">new</span> TestClassB().Display(<span class="str">"Test"</span>);</pre>
<pre class="alt"><span class="lnum">   7:  </span>            Console.ReadLine();</pre>
<pre><span class="lnum">   8:  </span>        }</pre>
<pre class="alt"><span class="lnum">   9:  </span>    }</pre>
<pre><span class="lnum">  10:  </span></pre>
<pre class="alt"><span class="lnum">  11:  </span>    <span class="kwrd">class</span> TestClassA</pre>
<pre><span class="lnum">  12:  </span>    {</pre>
<pre class="alt"><span class="lnum">  13:  </span>        <span class="kwrd">public</span> <span class="kwrd">void</span> Display(<span class="kwrd">int</span> b)</pre>
<pre><span class="lnum">  14:  </span>        {</pre>
<pre class="alt"><span class="lnum">  15:  </span>            Console.WriteLine(<span class="str">"This is TestClassA.Display() ..."</span>);</pre>
<pre><span class="lnum">  16:  </span>        }</pre>
<pre class="alt"><span class="lnum">  17:  </span>    }</pre>
<pre><span class="lnum">  18:  </span></pre>
<pre class="alt"><span class="lnum">  19:  </span>    <span class="kwrd">class</span> TestClassB</pre>
<pre><span class="lnum">  20:  </span>    {</pre>
<pre class="alt"><span class="lnum">  21:  </span>        <span class="kwrd">public</span> <span class="kwrd">void</span> Display(<span class="kwrd">string</span> s)</pre>
<pre><span class="lnum">  22:  </span>        {</pre>
<pre class="alt"><span class="lnum">  23:  </span>            Console.WriteLine(<span class="str">"This is TestClassB.Display() ..."</span>);</pre>
<pre><span class="lnum">  24:  </span>        }</pre>
<pre class="alt"><span class="lnum">  25:  </span>    }</pre>
<pre><span class="lnum">  26:  </span></pre>
<pre class="alt"><span class="lnum">  27:  </span>    <span class="kwrd">static</span> <span class="kwrd">class</span> TestClassExtention</pre>
<pre><span class="lnum">  28:  </span>    {</pre>
<pre class="alt"><span class="lnum">  29:  </span>        <span class="kwrd">static</span> <span class="kwrd">public</span> <span class="kwrd">void</span> Display(<span class="kwrd">this</span> <span class="kwrd">object</span> o, <span class="kwrd">string</span> s)</pre>
<pre><span class="lnum">  30:  </span>        {</pre>
<pre class="alt"><span class="lnum">  31:  </span>            Console.WriteLine(<span class="str">"This is TestClassExtention.Display() ..."</span>);</pre>
<pre><span class="lnum">  32:  </span>        }</pre>
<pre class="alt"><span class="lnum">  33:  </span>    }</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>程序输出：</p>
<p><a href="/pics/C3.0_13679/ExtentionMethod.jpg"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="ExtentionMethod" src="/pics/C3.0_13679/ExtentionMethod_thumb.jpg" border="0" alt="ExtentionMethod" width="684" height="167" /></a></p>
<p>可以看出,TestClassA的方法和扩展方法并没有冲突，因为他们的方法签名是不一样的，而TestClassB的方法和扩展方法有冲突，因为他们的都是接受一个string类型的输入参数。从结果可以看到，程序对Display的方法调用，TestClassB本身的Display方法，要“优先”于扩展方法Display被调用。因此，类本身的方法如果满足调用条件，那么这个方法会被优先执行，只有在类当中无法找到同样参数的方法时，扩展方法才有机会被执行。所以，我们可以得出这样的结论：扩展方法的优先级较低，也即扩展方法不会覆盖同名的类本身的方法。</p>
<p>另外，还有一个比较明显的区别，就是扩展方法要远远弱于类本身的方法，比如，在一个类中，类的方法可以访问自己的非公有成员，而扩展方法做不到这一点。</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/extension-method-uses-summary-2009-09-28.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

