﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-KiMoGiGi 技术文集</title><link>http://www.cnitblog.com/seeyeah/</link><description>不在乎选择什么，而在乎坚持多久……</description><language>zh-cn</language><lastBuildDate>Mon, 22 Mar 2010 07:48:19 GMT</lastBuildDate><pubDate>Mon, 22 Mar 2010 07:48:19 GMT</pubDate><ttl>60</ttl><item><title>文章摘选【20091008】</title><link>http://www.cnitblog.com/seeyeah/archive/2009/10/08/61734.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Thu, 08 Oct 2009 14:03:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/10/08/61734.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61734.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/10/08/61734.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61734.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61734.html</trackback:ping><description><![CDATA[1、<a target="_blank"  href="http://www.codeproject.com/KB/toolbars/VS_IDE_Dock_Container.aspx">Visual Studio IDE like Dock Container - Second Version</a><br><br>仿VS IDE风格DockContainer插件，有标签预览功能，比较Cool的Ctrl+Tab预览。<br><br>2、<a target="_blank"  href="http://www.codeproject.com/KB/recipes/HashFile.aspx">Save Key/Value Pairs in a File</a><br><br>Hashtable运用方面非常广泛，但如果遇到大数据的话，会导致耗用大量内存。因此本文提供把Hashtable的数据结构存到&#8220;文件&#8221;的方案。<br><br>3、<a target="_blank"  href="http://www.codeproject.com/KB/aspnet/SandBox_CometSample.aspx">Using IHttpAsyncHandler and XMLHttpRequest to &#8220;push&#8221; messages to the client<br></a><br>一个从服务器&#8220;推&#8221;信息到客户端的方案。<br><br><br><img src ="http://www.cnitblog.com/seeyeah/aggbug/61734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-10-08 22:03 <a href="http://www.cnitblog.com/seeyeah/archive/2009/10/08/61734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原】Json对象格式化字符串输出</title><link>http://www.cnitblog.com/seeyeah/archive/2009/09/29/61618.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Mon, 28 Sep 2009 16:44:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/09/29/61618.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61618.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/09/29/61618.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61618.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61618.html</trackback:ping><description><![CDATA[函数的主要功能是：传入一个Json对象（为了节省空间，一般请求返回的Json都是没有格式化的，可读性不好），可以输出格式化字符串，提高Json可读性。<br>虽然很多IDE或工具已经实现，但有时做简单测试时，格式化还是需要的。<br><br>假设，JS调用（假设界面有一个id为result的textarea）<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;json&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;Id:&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;Name:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Test</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;Date:&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Date(),<br>&nbsp;&nbsp;&nbsp;&nbsp;Subjects:<br>&nbsp;&nbsp;&nbsp;&nbsp;[<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">语文</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">数学</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">英语</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Marks:&nbsp;[</span><span style="color: #000000;">90</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">83</span><span style="color: #000000;">,&nbsp;{&nbsp;Test:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">aaa</span><span style="color: #000000;">"</span><span style="color: #000000;">}]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;],<br>&nbsp;&nbsp;&nbsp;&nbsp;Company:<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Microsoft</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Location:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">USA</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;},<br>&nbsp;&nbsp;&nbsp;&nbsp;Test:&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;"><br>};<br></span><span style="color: #008000;">//</span><span style="color: #008000;">-------------测试</span><span style="color: #008000;"><br>//</span><span style="color: #008000;">格式化Json字符串</span><span style="color: #008000;"><br></span><span style="color: #000000;">document.getElementById(</span><span style="color: #000000;">"</span><span style="color: #000000;">result</span><span style="color: #000000;">"</span><span style="color: #000000;">).value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;JsonUti.convertToString(json);<br></span></div>
<br>界面输出<br><br><img alt="" src="http://www.cnitblog.com/images/cnitblog_com/seeyeah/s1.jpg"><br>实现代码如下:<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;JsonUti&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">定义换行符</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">定义制表符</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">\t</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">转换String</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;convertToString:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(obj)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;JsonUti.__writeObj(obj,&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">写对象</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__writeObj:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(obj&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">对象</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;level&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">层次（基数为1）</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;isInArray)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">此对象是否在一个集合内</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果为空，直接输出null</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(obj&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">null</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">为普通类型，直接输出值</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(obj.constructor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;Number&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;obj.constructor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;Date&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;obj.constructor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;String&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;obj.constructor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;Boolean)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;v&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;obj.toString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;tab&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;isInArray&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;JsonUti.__repeatStr(JsonUti.t,&nbsp;level&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;:&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(obj.constructor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;String&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;obj.constructor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;Date)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">时间格式化只是单纯输出字符串，而不是Date对象</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;tab&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">"</span><span style="color: #000000;">\</span><span style="color: #000000;">""</span><span style="color: #000000;">&nbsp;+&nbsp;v&nbsp;+&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">\</span><span style="color: #000000;">""</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(obj.constructor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;Boolean)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;tab&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;v.toLowerCase();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;tab&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(v);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">写Json对象，缓存字符串</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;currentObjStrings&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">遍历属性</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;name&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;obj)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;temp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">格式化Tab</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;paddingTab&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;JsonUti.__repeatStr(JsonUti.t,&nbsp;level);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.push(paddingTab);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">写出属性名</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.push(name&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;obj[name];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(val&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.push(</span><span style="color: #000000;">"</span><span style="color: #000000;">null</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;c&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;val.constructor;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(c&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;Array)&nbsp;{&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果为集合，循环内部对象</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.push(JsonUti.n&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;paddingTab&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">[</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;JsonUti.n);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;levelUp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;level&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">层级+2</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;tempArrValue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">集合元素相关字符串缓存片段</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;val.length;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">递归写对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempArrValue.push(JsonUti.__writeObj(val[i],&nbsp;levelUp,&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.push(tempArrValue.join(</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;JsonUti.n));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.push(JsonUti.n&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;paddingTab&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">]</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(c&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;Function)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.push(</span><span style="color: #000000;">"</span><span style="color: #000000;">[Function]</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">递归写对象</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.push(JsonUti.__writeObj(val,&nbsp;level&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">加入当前对象&#8220;属性&#8221;字符串</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentObjStrings.push(temp.join(</span><span style="color: #000000;">""</span><span style="color: #000000;">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;(level&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">isInArray&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;JsonUti.n&nbsp;:&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果Json对象是内部，就要换行格式化</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;JsonUti.__repeatStr(JsonUti.t,&nbsp;level&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">{</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;JsonUti.n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">加层次Tab格式化</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;currentObjStrings.join(</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;JsonUti.n)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">串联所有属性值</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;JsonUti.n&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;JsonUti.__repeatStr(JsonUti.t,&nbsp;level&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">}</span><span style="color: #000000;">"</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">封闭对象</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__isArray:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(obj)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(obj)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;obj.constructor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;Array;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__repeatStr:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(str,&nbsp;times)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;newStr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(times&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;times;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newStr.push(str);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;newStr.join(</span><span style="color: #000000;">""</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br>&nbsp;<br></span></div>
<br>实例下载：<a  href="http://www.cnitblog.com/Files/seeyeah/JsonToString.rar" title="JsonToString.rar">JsonToString.rar</a><br><img src ="http://www.cnitblog.com/seeyeah/aggbug/61618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-09-29 00:44 <a href="http://www.cnitblog.com/seeyeah/archive/2009/09/29/61618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>翻译 Threading in C#    </title><link>http://www.cnitblog.com/seeyeah/archive/2009/09/25/61560.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Thu, 24 Sep 2009 16:30:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/09/25/61560.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61560.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/09/25/61560.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61560.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61560.html</trackback:ping><description><![CDATA[英文原版：<a style="text-decoration: underline;" target="_blank"  href="http://www.cnitblog.com/seeyeah/archive/2009/03/20/55575.html">http://www.cnitblog.com/seeyeah/archive/2009/03/20/55575.html</a><br>
<br>中文翻译：<a target="_blank"  href="http://knowledge.swanky.wu.googlepages.com/threading_in_c_sharp.html"><span style="text-decoration: underline;">http://knowledge.swanky.wu.googlepages.com/threading_in_c_sharp.html
</span></a><br> <img src ="http://www.cnitblog.com/seeyeah/aggbug/61560.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-09-25 00:30 <a href="http://www.cnitblog.com/seeyeah/archive/2009/09/25/61560.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VS2005 SP1 “无法使用此产品的安装源,请确认安装源存在,并且您可以访问它”的错误</title><link>http://www.cnitblog.com/seeyeah/archive/2009/09/22/61517.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Tue, 22 Sep 2009 02:58:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/09/22/61517.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61517.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/09/22/61517.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61517.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61517.html</trackback:ping><description><![CDATA[摘至：http://www.cnblogs.com/wayne-ivan/archive/2008/02/29/1086104.html<br><hr style="width: 100%; height: 2px;">系统：Windows 2003 std<br><br>安装的是 Visual Studio 2005 Team Suite 中文版，
昨天下了SP1准备打上， 却在提取文件后出现&#8220;无法使用此产品的安装源,请确认安装源存在,并且您可以访问它&#8221;的错误。
开始怀疑是自己装的VS版本的问题（下载版＋正式序列号）。 于是卸了，再去找来貌似完Retail的TS英文版装上， 下了个英文版的SP1，
问題依旧。 <br><br>Google了一下， 光见有问的，没见有回答的。 看来大多人安装都挺顺的， 自己找原因吧。<br><br>打开临时文件夹看了看， 找到安装Log， 看到了错误所在：&#8220;Error 1718. File was rejected by digital signature policy&#8221;。 有的放矢，解决问题就容易了。 <br><br><br>
<h2><font size="4">原因</font></h2>
当计算机没有足够的连续内存可供 Windows Server 2003 或 Windows XP 用于验证是否对 .msi 包或 .msp 包正确进行了签名时将出现此问题。<br>数字签名可帮助确保程序包不会被篡改。当 Windows Installer 调用 <strong>SaferIdentifyLevel</strong> 函数时，Windows Server 2003 和 Windows XP 使用其他安全级别，即软件限制策略。<br><br>当 Windows Installer 同时调用 <strong>SaferIdentifyLevel</strong> 函数和 <strong>SAFER_CRITERIA_IMAGEHASH</strong>
标志时，整个程序包被加载到计算机上的内存中。计算机必须拥有程序包大小所需的足够连续内存。如果计算机没有足够的连续内存，则会出现错误。由于出现错
误，Windows Installer 将无法验证是否对该程序包正确地进行了签名。因此，会收到&#8220;症状&#8221;部分中提到的错误消息。<br><br><br><font style="font-weight: bold;" size="4">方法一（建议使用）<br></font><font size="4"><font size="2">1. 打开注册表编辑器， 转到项：</font></font>HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Safer\CodeIdentifiers<br><br>2.将 PolicyScope 的注册表值从0改为1. （没有就新建一个）<br>3.命令行中执行 net stop msiserver 停止Windows Installer服务。<br>4.安装 SP1 （好慢，不过这回挺顺了）<br>5.装完把步骤2中的 PolicyScope值改回0.<br>6.喜欢的话就重启一下。<br><br><font style="font-weight: bold;" size="4">方法二<br></font>如果以上步骤不能解决该问题，请按照下列步骤操作：<br>1. 管理工具－》本地安全设置－》软件限制策略。（如果如果没有软件限制，右击&#8220;软件限制策略&#8221;，新建一个。）<br>2. &#8220;对象类型&#8221;下双击&#8220;强制&#8221;，并将第2个勾选从&#8220;所有用户&#8221;改为&#8220;除本地管理员以外的所有用户&#8221;<br>3. 重启，安装SP1.<br>4.改回原先设置。
<br><br><img src ="http://www.cnitblog.com/seeyeah/aggbug/61517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-09-22 10:58 <a href="http://www.cnitblog.com/seeyeah/archive/2009/09/22/61517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微软反跨站脚本库3.0 RTM</title><link>http://www.cnitblog.com/seeyeah/archive/2009/09/20/61497.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Sun, 20 Sep 2009 14:29:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/09/20/61497.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61497.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/09/20/61497.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61497.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61497.html</trackback:ping><description><![CDATA[摘至：http://www.cnblogs.com/shanyou/archive/2009/07/16/1524515.html<br><br>
<p>跨站脚本Cross-Site Scripting（XSS）又叫CSS (Cross Site Script)
，跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码，当用户浏览该页之时，嵌入其中Web里面的html代码会被执行，从而达到恶意
用户的特殊目的。XSS属于被动式的攻击，因为其被动且不好利用，所以许多人常呼略其危害性。<br>跨站脚本Cross-Site Scripting（XSS）是最为流行的Web安全漏洞之一。据统计，2007年，跨站脚本类的安全漏洞的数目已经远远超出传统类型的安全漏洞(<a title="http://en.wikipedia.org/wiki/Cross-site_scripting" href="http://en.wikipedia.org/wiki/Cross-site_scripting">http://en.wikipedia.org/wiki/Cross-site_scripting</a>)</p>
<p>虽然在IE8中引入了客户端的XSS过滤器以减少XSS对用户造成的危害，但是XSS本质上是Web应用服务的漏洞，仅仅依赖客户端的保护措施是不够的。解决问题的根本是在Web应用程序的代码中消除XSS安全漏洞。</p>
<p>以下是在Web应用的开发中避免XSS安全漏洞的几个原则：</p>
<ul>
    <li>检查所有产生动态网页的代码</li>
    <li>判定动态网页的内容是否包括不安全的输入信息</li>
    <li>对输入进行校验</li>
    <li>对输出进行编码以过滤特殊字符 </li>
</ul>
<p>采用不同的Web开发工具，实施以上原则的具体步骤也不相同。当需要将一个字符串输出到Web网页时，但又不能完全确定这个字符串是否包括HTML
的特殊字符，例如&#8220;&lt;,&gt;,&amp;&#8221;等等，可以使用编码（HTMLEncode）以过滤这些特殊字符。在ASP.NET中有两种方法：一
种是使用HttpUtility，另一种就是使用微软提供的XSS库，最新版本是3.0
,采用MS-PL协议发布的开源项目，7月14日发布了，下载地址是：<a title="http://www.microsoft.com/downloads/details.aspx?FamilyId=051ee83c-5ccf-48ed-8463-02f56a6bfc09&amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=051ee83c-5ccf-48ed-8463-02f56a6bfc09&amp;displaylang=en">http://www.microsoft.com/downloads/details.aspx?FamilyId=051ee83c-5ccf-48ed-8463-02f56a6bfc09&amp;displaylang=en</a>。</p>
<p>AntiXss的使用方式与HttpUtility类似：</p>
<p>String Name = AntiXss.HtmlEncode(Request.QueryString["Name"]);</p>
<p>它们最大的区别在于HttpUtility.HtmlEncode采用的是黑名单验证（Black
list）方式。即HttpUtility.HtmlEncode仅仅过滤它知道的特殊字符，而允许其它的输入。AntiXss.HtmlEncode采
用的白名单验证（White list）方式。它只允许输出它认为合法的字符，而过滤掉其它的所有字符。</p>
<p>两者中，AntiXss.HtmlEncode要更为安全，是推荐的使用手段。</p>
<p>在asp.net 程序中避免 Cross-Site Scripting 攻击的正确方法：</p>
<p>(1) ValidateRequest = true</p>
<p>(2) 对于所有使用者的输入加以<strong> 编码</strong> 并检查长度 ： Application、Session、Url QueryString、Cookie、HTTP Header、数据库、文件、Form表单(根据输出的区域，使用以下相对应的七种编码方法)</p>
<p>&nbsp;</p>
<p>XSS Libray 包含如下的方法：</p>
<table border="0" cellpadding="2" cellspacing="0" width="987">
    <tbody>
        <tr>
            <td valign="top" width="200"><strong> Encoding Method</strong> </td>
            <td valign="top" width="785"><strong> Description</strong> </td>
        </tr>
        <tr>
            <td valign="top" width="200">HtmlEncode</td>
            <td valign="top" width="785">Encodes input strings for use in HTML </td>
        </tr>
        <tr>
            <td valign="top" width="200">HtmlAttributeEncode </td>
            <td valign="top" width="785">Encodes input strings for use in HTML attributes </td>
        </tr>
        <tr>
            <td valign="top" width="200">JavaScriptEncode </td>
            <td valign="top" width="785">Encodes input strings for use in JavaScript </td>
        </tr>
        <tr>
            <td valign="top" width="200">UrlEncode </td>
            <td valign="top" width="785">Encodes input strings for use in Universal Resource Locators (URLs)</td>
        </tr>
        <tr>
            <td valign="top" width="200">VisualBasicScriptEncode </td>
            <td valign="top" width="785">Encodes input strings for use in Visual Basic Script </td>
        </tr>
        <tr>
            <td valign="top" width="200">XmlEncode </td>
            <td valign="top" width="785">Encodes input strings for use in XML </td>
        </tr>
        <tr>
            <td valign="top" width="200">XmlAttributeEncode </td>
            <td valign="top" width="785">Encodes input strings for use in XML attributes </td>
        </tr>
    </tbody>
</table>
<p>具体的使用方法及示例，请参考MSDN： <a href="http://msdn.microsoft.com/en-us/library/aa973813.aspx">Microsoft Anti-Cross Site Scripting Library V1.5: Protecting the Contoso Bookmark Page</a>&nbsp;</p>
<p>AntiXSS Library v3.0 除了保留了老版本的一些静态的Encode工具方法(重新实现),另外最重要的就是新增了<br>AntiXSS HttpModule 用于统一 Encode 输出ASP.Net Server Web Control 为encode 输出的相关属性,如:Text属性等<br>原理大概是《利用 HttpModule,基于输出,统一控制、干预、处理(例如: 过滤关键字、AntiXSS) ASP.Net WebForm Control 展现属性的方案原型》<br><a href="http://www.cnblogs.com/Microshaoft/archive/2009/01/08/1371475.html" target="_blank"><font color="#f03331">http://www.cnblogs.com/Microshaoft/archive/2009/01/08/1371475.html</font></a><br><br></p>
<p>微软反跨站脚本库主页：<a title="http://msdn.microsoft.com/en-us/security/aa973814.aspx" href="http://msdn.microsoft.com/en-us/security/aa973814.aspx">http://msdn.microsoft.com/en-us/security/aa973814.aspx</a><br>XSS（跨站）攻击全解析: <a href="http://www4.it168.com/jtzt/shenlan/safe/xss/">http://www4.it168.com/jtzt/shenlan/safe/xss/</a><br>CodePlex站点: <a href="http://antixss.codeplex.com/">http://antixss.codeplex.com/</a></p>
<br>作者: <a href="http://shanyou.cnblogs.com/" target="_blank">自由、创新、研究、探索&#8230;&#8230;</a><br>
出处：<a href="http://shanyou.cnblogs.com/" target="_blank">http://shanyou.cnblogs.com/</a><br>
版权：本文版权归作者和博客园共有<br>
转载：欢迎转载，为了保存作者的创作热情，请按要求【转载】，谢谢<br>
要求：未经作者同意，必须保留此段声明；必须在文章中给出原文连接；否则必究法律责任 <br>
个人网站: <a href="http://www.openbeta.cn/">http://www.openbeta.cn/</a>
<br><br><img src ="http://www.cnitblog.com/seeyeah/aggbug/61497.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-09-20 22:29 <a href="http://www.cnitblog.com/seeyeah/archive/2009/09/20/61497.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原】扩展log4net的PatternLayout</title><link>http://www.cnitblog.com/seeyeah/archive/2009/09/20/61491.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Sat, 19 Sep 2009 16:53:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/09/20/61491.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61491.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/09/20/61491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61491.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61491.html</trackback:ping><description><![CDATA[		<strong>
一、需求
</strong>
<br>
<br>PatternLayout的配置格式化如下所示：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">layout&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="log4net.Layout.PatternLayout"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">conversionPattern&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">="[%date{yyyy-MM-dd&nbsp;HH:mm:ss}]&nbsp;[%level]&nbsp;%message&nbsp;%exception&nbsp;%newline"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">layout</span><span style="color: #0000ff;">&gt;</span></div>
<br>由PatternLayout的conversionPattern来设置一个&#8220;模板&#8221;信息。其变量都有&#8220;%&#8221;开头的单词标识。如%level、%message；变量也可以传入参数，如%date{ yyyy-MM-dd HH:mm:ss }，其中yyyy-MM-dd HH:mm:ss就是%date的参数。<br><br>PatternLayout默认所可以支持的单词标识，请参考：<br><a style="text-decoration: underline;" target="_blank" href="http://www.cnitblog.com/seeyeah/archive/2008/10/15/50291.html">http://www.cnitblog.com/seeyeah/archive/2008/10/15/50291.html</a><br><br>现在我们需要扩展这些单词标记。<br>假设模板字符串定义如下所示：<br>&nbsp;[%date{yyyy-MM-dd HH:mm:ss}] %o{Message}，%o{User} %newline"<br>注意%o{Message}，%o是我们要实现扩展的一个标记，标识传入的message的对象，后面的参数{Message}、{User}表示message的对象的2个属性名。<br><br>我们先设计一个传递日志消息的实体类，定义如下所示<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;SampleMessage<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;Message&nbsp;{&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">;&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;User&nbsp;{&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">;&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">;&nbsp;}<br>}</span></div>
<br><br>如下调用ILog的Info方法。<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">log.Info(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SampleMessage()&nbsp;{&nbsp;Message&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Test1</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;User&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">User1</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;});<br>log.Info(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SampleMessage()&nbsp;{&nbsp;Message&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Test2</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;User&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">User2</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;});</span></div>
<br><br>我们想要的结果如下所示：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">[</span><span style="color: #000000;">2009</span><span style="color: #000000;">-</span><span style="color: #000000;">09</span><span style="color: #000000;">-</span><span style="color: #000000;">19</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">14</span><span style="color: #000000;">:</span><span style="color: #000000;">27</span><span style="color: #000000;">:</span><span style="color: #000000;">29</span><span style="color: #000000;">]&nbsp;Test1，User1<br>[</span><span style="color: #000000;">2009</span><span style="color: #000000;">-</span><span style="color: #000000;">09</span><span style="color: #000000;">-</span><span style="color: #000000;">19</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">14</span><span style="color: #000000;">:</span><span style="color: #000000;">27</span><span style="color: #000000;">:</span><span style="color: #000000;">29</span><span style="color: #000000;">]&nbsp;Test2，User2&nbsp;</span></div>
<br><br><strong>二、方案<br></strong><br>Log4net用appender来记录日志的加载方式，内置就有很多种appender：RollingFileAppender、ConsoleAppender、AdoNetAppender等等。其中，日志信息的格式由appender中的layout掌控，log4net内置的layout是log4net.Layout.PatternLayout。<br><br>Appender（具体以RollingFileAppender为例，其他类型Appender类似）与layout的关系如下所示：<br>&nbsp;<br><img alt="" src="http://www.cnitblog.com/images/cnitblog_com/seeyeah/log4net/1.jpg" height="464" width="396"><br><br>RollingFileAppender的基类FileAppender以及TextWriterAppender是文件日志类的公用基类。AppenderSkeleton是所有log4net的appender的基类，内部封装了常用方法，如线程锁定、日志等级过滤和支持一般的文件写入等。<br><br>另外一边的PatternLayout，结构跟Appender相似，IAppender包含一个ILayout负责格式化日志的格式。因此如果我们要扩展日志的格式化，就需要扩展PatternLayout。<br><strong><br></strong><strong>三、实现</strong><br><strong><br></strong>下面说明，扩展PatternLayout的实现过程。<br><br><strong>Step1：实现一个Converter</strong><br><br>Log4net内置提供的每个模板参数，都有对应的Converter做处理。如%message对应MessagePatternConverter；%date对应DatePatternConverter等。这个对应关系可以查看log4net的源代码PatternLayout.cs的静态构造函数，内部用一个静态的Hashtable管理关键字与Converter的关系：<strong><br></strong><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;Initialize&nbsp;the&nbsp;global&nbsp;registry<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;remarks&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;para&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;Defines&nbsp;the&nbsp;builtin&nbsp;global&nbsp;rules.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/para&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/remarks&gt;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;PatternLayout()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_globalRulesRegistry&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Hashtable(</span><span style="color: #000000;">45</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_globalRulesRegistry.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">literal</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(log4net.Util.PatternStringConverters.LiteralPatternConverter));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_globalRulesRegistry.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">newline</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(log4net.Util.PatternStringConverters.NewLinePatternConverter));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_globalRulesRegistry.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(log4net.Util.PatternStringConverters.NewLinePatternConverter));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_globalRulesRegistry.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">c</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(LoggerPatternConverter));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_globalRulesRegistry.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">logger</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(LoggerPatternConverter));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_globalRulesRegistry.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">C</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(TypeNamePatternConverter));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_globalRulesRegistry.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">class</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(TypeNamePatternConverter));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_globalRulesRegistry.Add(</span><span style="color: #000000;">"</span><span style="color: #000000;">type</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(TypeNamePatternConverter));</span></div>
<strong><br></strong>再看看我们将要实现的模板字符串：<br>[%date{yyyy-MM-dd HH:mm:ss}] %o{Message}，%o{User} %newline"<br>我们要实现的关键字是&#8220;o&#8221;，按照log4net的PatternLayout的设计，我们也要相应实现一个Converter去解析关键字是&#8220;o&#8221;的内容，我们定义这个类名为ObjectConverter。<br><br>下面是ObjectConverter的实现方式，实现较为简单，详细看注释：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;根据键值获取值的对象<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;IGetObjectValueByKey<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;GetByKey(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;对应%o的对象转换器<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;remarks&gt;</span><span style="color: #008000;">用于PatternLayout</span><span style="color: #808080;">&lt;/remarks&gt;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ObjectConverter&nbsp;:&nbsp;PatternLayoutConverter<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Func</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;funcs;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;ObjectConverter()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">********根据键值获取值的顺序<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">从接口获取值</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;funcs&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;GetValueByInterface;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">反射获取属性值</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;funcs&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;GetValueByReflection;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">从索引值获取值</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;funcs&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;GetValueByIndexer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;实现PatternLayoutConverter.Convert抽象方法<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="writer"&gt;&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="loggingEvent"&gt;&lt;/param&gt;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">override</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Convert(TextWriter&nbsp;writer,&nbsp;LoggingEvent&nbsp;loggingEvent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获取传入的消息对象</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;objMsg&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;loggingEvent.MessageObject;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(objMsg&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果对象为空输出log4net默认的null字符串</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.Write(SystemInfo.NullText);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">.IsNullOrEmpty(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.Option))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果属性为空，输出消息对象的ToString()</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.Write(objMsg.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;GetValue(funcs,&nbsp;objMsg,&nbsp;Option);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.Write(val&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">&nbsp;:&nbsp;val.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">#region</span><span style="color: #000000;">&nbsp;静态方法</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;循环方法列表，根据键值获取值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="func"&gt;</span><span style="color: #008000;">方法列表委托</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="obj"&gt;</span><span style="color: #008000;">对象</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="name"&gt;</span><span style="color: #008000;">键值</span><span style="color: #808080;">&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;GetValue(Func</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;func,&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;obj,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(func&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">foreach</span><span style="color: #000000;">&nbsp;(Func</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;del&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;func.GetInvocationList())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;del(obj,&nbsp;name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果获取的值不为null，则跳出循环</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(val&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;val;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;使用接口方式取值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="obj"&gt;&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="name"&gt;&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;remarks&gt;</span><span style="color: #008000;">效率最高，避免了反射带来的效能损耗</span><span style="color: #808080;">&lt;/remarks&gt;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;GetValueByInterface(</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;obj,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IGetObjectValueByKey&nbsp;objConverter&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;obj&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;IGetObjectValueByKey;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(objConverter&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;objConverter.GetByKey(name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;val;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;反射对象的获取属性，获取属性值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="obj"&gt;&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="name"&gt;&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;GetValueByReflection(</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;obj,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;t&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;obj.GetType();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;propertyInfo&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;t.GetProperty(name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(propertyInfo&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;propertyInfo.GetValue(obj,&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;val;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;反射对象的索引器，获取值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="obj"&gt;&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;param&nbsp;name="name"&gt;&lt;/param&gt;</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;</span><span style="color: #808080;">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;GetValueByIndexer(</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;obj,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodInfo&nbsp;getValueMethod&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;obj.GetType().GetMethod(</span><span style="color: #000000;">"</span><span style="color: #000000;">get_Item</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(getValueMethod&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getValueMethod.Invoke(obj,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">[]&nbsp;{&nbsp;name&nbsp;});<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;val;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span></div>
<br><br><br>主要是ObjectConvertert按顺序用了3种从键值获取值的方式<br>1、&nbsp;&nbsp;&nbsp; 对象实现了我们所定义的接口IGetObjectValueByKey，直接调用方法获取。此方法效率最好，因为内部避免了反射所带来的损耗。<br>2、&nbsp;&nbsp;&nbsp; 用反射获取属性值<br>3、&nbsp;&nbsp;&nbsp; 用反射获取索引值<strong><br><br><br>Step2：把Converter注册到PatternLayout</strong><br><br>现在我们需要把已实现的ObjectConverter加入PatternLayout的解析逻辑中。<br>我们先从ILog中找到藏在里面的PatternLayout实例，实现如下代码所示：<strong><br><br></strong>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">var&nbsp;log&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Log4NetCommon.GetLog(</span><span style="color: #000000;">"</span><span style="color: #000000;">LogConfig1st</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>var&nbsp;appender&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;log.Logger.Repository.GetAppenders()[</span><span style="color: #000000;">0</span><span style="color: #000000;">];<br>var&nbsp;layout&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;((appender&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;AppenderSkeleton).Layout&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;PatternLayout);<br></span></div>
<strong><br></strong>Log4NetCommon是我们自己用于初始化Log4Net的工具类。log是我们一般主打使用日志的ILog实例，第二行我们找到对应的Appender，最后通过转换类型找到了PatternLayout。<br><br>PatternLayout提供了AddConverter方法，可以轻松加入我们刚实现Converter。<br>AddConverter有2个签名版本：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;AddConverter(ConverterInfo&nbsp;converterInfo)<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;AddConverter(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name,&nbsp;Type&nbsp;type)</span></div>
<br>根据源代码对AddConverter的解析<br>Programmatic users should use the alternative &lt;see cref="AddConverter(string,Type)"/&gt; method.<br>我们还是按要求调用AddConverter(string name, Type type)的版本。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">layout.AddConverter(</span><span style="color: #000000;">"</span><span style="color: #000000;">o</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(ObjectConverter));</span></div>
<br><br>但目前还是不能解析模板中关键字&#8220;o&#8221;，为什么呢？<br><br>首先我们先简单了解一下PatternLayout如何、在什么时候注册关键字与Converter。<br><br>1、&nbsp;&nbsp;&nbsp; 在PatternLayout中，定义了一个s_globalRulesRegistry的静态Hashtable，Key为关键字，Value为对应的Converter类型。在PatternLayout的静态构造函数中，先会注册log4net内置的45个关键字。<br>2、&nbsp;&nbsp;&nbsp; 初始化log4net配置的时候，会调用PatternLayout的ActivateOptions初始化以上的配置，以及在ActivateOptions中会调用CreatePatternParser解析配置中的模板字符串。<br><br>在初始化log4net配置的时候，都还没来得及AddConverter，log4net就已经解析完毕了。因此在调用了AddConverter，即修改了所有有关PatternLayout配置时，必须再手动调用一次ActivateOptions重新解析一次模板字符串。<br><br>全部代码实现如下所示：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">var&nbsp;log&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Log4NetCommon.GetLog(</span><span style="color: #000000;">"</span><span style="color: #000000;">LogConfig1st</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><br>var&nbsp;appender&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;log.Logger.Repository.GetAppenders()[</span><span style="color: #000000;">0</span><span style="color: #000000;">];<br>var&nbsp;layout&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;((appender&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;AppenderSkeleton).Layout&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;PatternLayout);<br>layout.AddConverter(</span><span style="color: #000000;">"</span><span style="color: #000000;">o</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(ObjectConverter));<br>layout.ActivateOptions();<br></span></div>
<br>实现完毕！<br><br><strong><br></strong><strong>三、全部代码下载</strong><br><br><a href="http://www.cnitblog.com/Files/seeyeah/Log4NetPatternLayoutExtension.zip" title="Log4NetPatternLayoutExtension.zip">Log4NetPatternLayoutExtension.zip</a><br><br>  <img src ="http://www.cnitblog.com/seeyeah/aggbug/61491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-09-20 00:53 <a href="http://www.cnitblog.com/seeyeah/archive/2009/09/20/61491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个简单的性能计数器：CodeTimer</title><link>http://www.cnitblog.com/seeyeah/archive/2009/09/17/61456.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Thu, 17 Sep 2009 05:19:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/09/17/61456.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61456.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/09/17/61456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61456.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61456.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘至：http://www.cnblogs.com/JeffreyZhao/archive/2009/03/10/CodeTimer.html有数据，有真相，相信大家在平时的工作或学习过程中，都需要比较几种不同方法或实现之间的性能差距。在这些时候，往往就需要我们不断地创建Stopwatch，打开，关闭，然后打印时间。这种一遍又一遍的重复终有一天会让人忍无可忍，因此如果能有一个“标准”的性能计数...&nbsp;&nbsp;<a href='http://www.cnitblog.com/seeyeah/archive/2009/09/17/61456.html'>阅读全文</a><img src ="http://www.cnitblog.com/seeyeah/aggbug/61456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-09-17 13:19 <a href="http://www.cnitblog.com/seeyeah/archive/2009/09/17/61456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Fast Reflection Library</title><link>http://www.cnitblog.com/seeyeah/archive/2009/09/17/61455.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Thu, 17 Sep 2009 05:16:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/09/17/61455.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61455.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/09/17/61455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61455.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61455.html</trackback:ping><description><![CDATA[摘至：http://www.cnblogs.com/JeffreyZhao/archive/2009/02/01/Fast-Reflection-Library.html<br /><br />这是我在CodePlex上创建的一个项目，它的网址是<a href="http://www.codeplex.com/FastReflectionLib">http://www.codeplex.com/FastReflectionLib</a>，使用Microsoft Public License (Ms-PL)，您可以随意在自己的产品中使用它的全部或部分代码。这个项目用到了我在《<a href="http://www.cnblogs.com/JeffreyZhao/archive/2008/11/24/invoke-method-by-lambda-expression.html">方法的直接调用，反射调用与Lambda表达式调用</a>》和《<a href="http://www.cnblogs.com/JeffreyZhao/archive/2009/01/09/DynamicPropertyAccessor-and-FastEval.html">这下没理由嫌Eval的性能差了吧？</a>》两篇文章里用到的做法，并加以提炼和扩展发布的项目——随便搞搞，留个印记，也供以后参考。 <h4>基本使用方式</h4><p>　
　反射是.NET中非常重要的功能。使用反射来构造对象、调用方法或是访问属性是某些项目中常用的做法之一（例如ORM框架）。众所周知，与一个成员的直
接访问相比，反射调用的性能要低好几个数量级。FastReflectionLib提供了一种简便的方式，使一些常用反射调用的性能得到大幅提高。如下：</p><pre class="code"><span style="color: blue;">using </span>System;<br /><span style="color: blue;">using </span>System.Reflection;<br /><span style="color: blue;">using </span>FastReflectionLib;<br /><br /><span style="color: blue;">namespace </span>SimpleConsole<br />{<br /><span style="color: blue;">class </span><span style="color: rgb(43, 145, 175);">Program<br /></span>{<br /><span style="color: blue;">static void </span>Main(<span style="color: blue;">string</span>[] args)<br />        {<br /><span style="color: rgb(43, 145, 175);">PropertyInfo </span>propertyInfo = <span style="color: blue;">typeof</span>(<span style="color: blue;">string</span>).GetProperty(<span style="color: rgb(163, 21, 21);">"Length"</span>);<br /><span style="color: rgb(43, 145, 175);">MethodInfo </span>methodInfo = <span style="color: blue;">typeof</span>(<span style="color: blue;">string</span>).GetMethod(<span style="color: rgb(163, 21, 21);">"Contains"</span>);<br /><br /><span style="color: blue;">string </span>s = <span style="color: rgb(163, 21, 21);">"Hello World!"</span>;<br /><br /><span style="color: green;">// get value by normal reflection<br /></span><span style="color: blue;">int </span>length1 = (<span style="color: blue;">int</span>)propertyInfo.GetValue(s, <span style="color: blue;">null</span>);<br /><span style="color: green;">// get value by the extension method from FastReflectionLib,<br />            // which is much faster<br /></span><span style="color: blue;">int </span>length2 = (<span style="color: blue;">int</span>)propertyInfo.FastGetValue(s);<br /><br /><span style="color: green;">// invoke by normal reflection<br /></span><span style="color: blue;">bool </span>result1 = (<span style="color: blue;">bool</span>)methodInfo.Invoke(s, <span style="color: blue;">new object</span>[] { <span style="color: rgb(163, 21, 21);">"Hello" </span>});<br /><span style="color: green;">// invoke by the extension method from FastReflectionLib,<br />            // which is much faster<br /></span><span style="color: blue;">bool </span>result2 = (<span style="color: blue;">bool</span>)methodInfo.FastInvoke(s, <span style="color: blue;">new object</span>[] { <span style="color: rgb(163, 21, 21);">"Hello" </span>});<br />        }<br />    }<br />}<br /></pre><p>　　在得到了PropertyInfo或MethodInfo对象之后，我们可以使用GetValue或Invoke方法来访问属性或调用方法。在
FastReflectionLib中为PropertyInfo、MethodInfo等对象定义了对应的扩展方法，于是我们就可以使用这些扩展方法
（从代码上看来，基本上只是在原来的方法之前加上“Fast”）来进行调用，与之前的方法相比，新的扩展方法性能有极大的提高。</p><h4>直接使用各工作对象</h4><p>　　各FastXxx方法实际上是将PropertyInfo等对象作为Key去一个Cache中获取对应的工作对象，然后调用工作对象上对应的方法。因此，直接调用工作对象可以获得更好的性能。各工作对象类型的对应关系如下：</p><ul><li>PropertyInfo：IPropertyAccessor 
</li><li>MethodInfo：IMethodInvoker 
</li><li>ConstructorInfo：IConstructorInvoker 
</li><li>FieldInfo：IFieldAccessor</li></ul><p>　　我们可以使用FastReflectionCaches.MethodInvokerCache来获取一个IMethodInvoker对象：</p><pre class="code"><span style="color: blue;">static void </span>Execute(<span style="color: rgb(43, 145, 175);">MethodInfo </span>methodInfo, <span style="color: blue;">object </span>instance, <span style="color: blue;">int </span>times)<br />{ <br /><span style="color: rgb(43, 145, 175);">IMethodInvoker </span>invoker = <span style="color: rgb(43, 145, 175);">FastReflectionCaches</span>.MethodInvokerCache.Get(methodInfo);<br /><span style="color: blue;">object</span>[] parameters = <span style="color: blue;">new object</span>[0];<br /><span style="color: blue;">for </span>(<span style="color: blue;">int </span>i = 0; i &lt; times; i++)<br />    {<br />        invoker.Invoke(instance, parameters);<br />    }<br />}<br /></pre><h4>工作对象的默认实现与扩展</h4><p>　　在FastReflectionLib中，已经提供了IPropertyAccessor等接口的默认实现。该实现将会构造一颗表达式树
（Expression
Tree）并将其编译（调用其Compile方法）以获得一个与反射方法签名相同的委托对象。这是一种简单、通用而安全的实现，由于Compile方法使
用了Emit，其性能也较为令人满意（可见下面的性能测试）。但是这并不是性能最高的做法，如果使用Emit生成最优化的代码，其性能甚至会高于方法的直
接调用（例如<a href="http://www.codeplex.com/Dynamic">Dynamic Reflection Library</a>）。如果您想使用更好的实现来替换，则可以自行构造一个工作对象接口的实现，并替换对应的Factory：</p><pre class="code"><span style="color: blue;">public class </span><span style="color: rgb(43, 145, 175);">BetterPropertyAccessor </span>: <span style="color: rgb(43, 145, 175);">IPropertyAccessor<br /></span>{<br /><span style="color: blue;">public </span>BetterPropertyAccessor(<span style="color: rgb(43, 145, 175);">PropertyInfo </span>propertyInfo) { ... }<br /><br />    ...<br />}<br /><br /><span style="color: blue;">public class </span><span style="color: rgb(43, 145, 175);">BetterPropertyAccessorFactory </span>:<br /><span style="color: rgb(43, 145, 175);">IFastReflectionFactory</span>&lt;<span style="color: rgb(43, 145, 175);">PropertyInfo</span>, <span style="color: rgb(43, 145, 175);">IPropertyAccessor</span>&gt;<br />{<br /><span style="color: blue;">public </span><span style="color: rgb(43, 145, 175);">IPropertyAccessor </span>Create(<span style="color: rgb(43, 145, 175);">PropertyInfo </span>key)<br />    {<br /><span style="color: blue;">return new </span><span style="color: rgb(43, 145, 175);">BetterPropertyAccessor</span>(key);<br />    }<br />}<br /><br /><span style="color: blue;">class </span><span style="color: rgb(43, 145, 175);">Program<br /></span>{<br /><span style="color: blue;">static void </span>Main(<span style="color: blue;">string</span>[] args)<br />    {<br /><span style="color: rgb(43, 145, 175);">FastReflectionFactories</span>.PropertyAccessorFactory =<br /><span style="color: blue;">new </span><span style="color: rgb(43, 145, 175);">BetterPropertyAccessorFactory</span>();<br /><br />        ...<br />    }<br />}<br /></pre><h4>缓存的默认实现与扩展</h4><p>　　在FastReflectionLib中使用基于
System.Collections.Generic.Dictionary&lt;TKey,
TValue&gt;类型编写的缓存容器。每次调用FastXxx扩展方法时，类库将从对应的缓存容器中获取工作对象。如果缓存容器中还没有所需的工作对
象，那么它就会调用合适的Factory来构造新的工作对象。从下面的性能测试来看，许多时间是消耗在缓存查找上的，如果您有更好的缓存实现，可以使用以
下的方法替换默认的缓存的容器：</p><pre class="code"><span style="color: blue;">public class </span><span style="color: rgb(43, 145, 175);">BetterMethodInvokerCache </span>:<br /><span style="color: rgb(43, 145, 175);">IFastReflectionCache</span>&lt;<span style="color: rgb(43, 145, 175);">MethodInfo</span>, <span style="color: rgb(43, 145, 175);">IMethodInvoker</span>&gt;<br />{<br /><span style="color: blue;">public </span><span style="color: rgb(43, 145, 175);">IMethodInvoker </span>Get(<span style="color: rgb(43, 145, 175);">MethodInfo </span>key) { ... }<br />}<br /><br /><span style="color: blue;">class </span><span style="color: rgb(43, 145, 175);">Program<br /></span>{<br /><span style="color: blue;">static void </span>Main(<span style="color: blue;">string</span>[] args)<br />    {<br /><span style="color: rgb(43, 145, 175);">FastReflectionCaches</span>.MethodInvokerCache = <br /><span style="color: blue;">new </span><span style="color: rgb(43, 145, 175);">BetterMethodInvokerCache</span>();<br /><br />        ...<br />    }<br />}<br /></pre><h4>根据需要自行缓存工作对象</h4><p>　　FastReflectionLib中通过PropertyInfo等对象作为Key，对PropertyAccessor等工作对象进行缓
存。但是在某些场景下，您也可以选择合适的方式来自行缓存工作对象。与FastReflectionLib源码同时发布的CustomCache示例网站
中包含了一个FastEval扩展，在某些场景下，我们可以使用这个更高效的方法来替换内置的Eval方法。这个示例的特点如下：</p><ul><li>使用对象的类型和属性名同时作为缓存的Key获取对应的PropertyAccessor对象 
</li><li>使用PropertyAccessor获取“匿名对象”中的属性值 
</li><li>缓存的作用域为特定页面，而不是整个AppDomain。</li></ul><h4>性能测试</h4><p>　　FastReflectionLib源码中包含了一个性能测试项目，您可以从中看出FastReflectionLib对于反射的性能改进。摘录部分数据如下（测试在我的笔记本上运行，Release编译）。</p><p>　　执行以下方法：</p><pre class="code"><span style="color: blue;">public class </span><span style="color: rgb(43, 145, 175);">Test<br /></span>{<br /><span style="color: blue;">public void </span>MethodWithArgs(<span style="color: blue;">int </span>a1, <span style="color: blue;">string </span>a2) { }<br />}<br /></pre><p>　　进行一百万次调用，结果如下：</p><table border="1" cellpadding="5" cellspacing="0"><tbody align="middle"><tr><td><strong>调用方式</strong></td><td><strong>消耗时间（秒）</strong></td></tr><tr><td>方法直接调用</td><td>0.0071397</td></tr><tr><td>内置反射调用</td><td>1.4936181</td></tr><tr><td>工作对象调用</td><td>0.0468326</td></tr><tr><td>Fast方法调用</td><td>0.1373712</td></tr></tbody></table><br /><img src ="http://www.cnitblog.com/seeyeah/aggbug/61455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-09-17 13:16 <a href="http://www.cnitblog.com/seeyeah/archive/2009/09/17/61455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对ashx请求用Gzip,Deflated压缩</title><link>http://www.cnitblog.com/seeyeah/archive/2009/09/15/61405.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Tue, 15 Sep 2009 01:06:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/09/15/61405.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61405.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/09/15/61405.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61405.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61405.html</trackback:ping><description><![CDATA[摘至：<a id="ctl04_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/liuju150/archive/2009/09/14/1566479.html">对ashx请求用Gzip,Deflated压缩</a><br /><br />//GZIP压缩<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">查看请求头部</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 255);">string</span><span style="color: rgb(0, 0, 0);"> acceptEncoding </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> context.Request.Headers[</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Accept-Encoding</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">].ToString().ToUpperInvariant();<br /></span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">String.IsNullOrEmpty(acceptEncoding))<br />{<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">如果头部里有包含"GZIP”,"DEFLATE",表示你浏览器支持GZIP,DEFLATE压缩</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (acceptEncoding.Contains(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">GZIP</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">))<br />    {<br />        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">向输出流头部添加压缩信息</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        context.Response.AppendHeader(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Content-encoding</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">gzip</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />        context.Response.Filter </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> GZipStream(context.Response.Filter, CompressionMode.Compress);<br />    }<br />    </span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (acceptEncoding.Contains(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">DEFLATE</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">))<br />    {<br />        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">向输出流头部添加压缩信息</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        context.Response.AppendHeader(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Content-encoding</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">deflate</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />        context.Response.Filter </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> DeflateStream(context.Response.Filter, CompressionMode.Compress);<br />    }<br />}</span></div><br /><p>这样每次context.Response.Write出支的数据就压缩了</p><p>对效多的文本信息压缩可以压缩到原来三分之一到四分之一的样子</p><p>如果发送的信息只有几个字节就没有必要了</p><br /><br /><br /><img src ="http://www.cnitblog.com/seeyeah/aggbug/61405.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-09-15 09:06 <a href="http://www.cnitblog.com/seeyeah/archive/2009/09/15/61405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>js控制media player参数</title><link>http://www.cnitblog.com/seeyeah/archive/2009/09/10/61344.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Thu, 10 Sep 2009 06:50:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/09/10/61344.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/61344.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/09/10/61344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/61344.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/61344.html</trackback:ping><description><![CDATA[
		<div class="blog_content">
				<div class="postbody">
						<div class="code">&lt;object id="player" height="64" width="260" classid="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6"&gt; <br />&lt;param NAME="AutoStart" VALUE="-1"&gt; <br />&lt;!--是否自动播放--&gt; <br />&lt;param NAME="Balance" VALUE="0"&gt; <br />&lt;!--调整左右声道平衡,同上面旧播放器代码--&gt; <br />&lt;param name="enabled" value="-1"&gt; <br />&lt;!--播放器是否可人为控制--&gt; <br />&lt;param NAME="EnableContextMenu" VALUE="-1"&gt; <br />&lt;!--是否启用上下文菜单--&gt; <br />&lt;param NAME="url" value="/blog/1.wma"&gt; <br />&lt;!--播放的文件地址--&gt; <br />&lt;param NAME="PlayCount" VALUE="1"&gt; <br />&lt;!--播放次数控制,为整数--&gt; <br />&lt;param name="rate" value="1"&gt; <br />&lt;!--播放速率控制,1为正常,允许小数,1.0-2.0--&gt; <br />&lt;param name="currentPosition" value="0"&gt; <br />&lt;!--控件设置:当前位置--&gt; <br />&lt;param name="currentMarker" value="0"&gt; <br />&lt;!--控件设置:当前标记--&gt; <br />&lt;param name="defaultFrame" value=""&gt; <br />&lt;!--显示默认框架--&gt; <br />&lt;param name="invokeURLs" value="0"&gt; <br />&lt;!--脚本命令设置:是否调用URL--&gt; <br />&lt;param name="baseURL" value=""&gt; <br />&lt;!--脚本命令设置:被调用的URL--&gt; <br />&lt;param name="stretchToFit" value="0"&gt; <br />&lt;!--是否按比例伸展--&gt; <br />&lt;param name="volume" value="50"&gt; <br />&lt;!--默认声音大小0%-100%,50则为50%--&gt; <br />&lt;param name="mute" value="0"&gt; <br />&lt;!--是否静音--&gt; <br />&lt;param name="uiMode" value="mini"&gt; <br />&lt;!--播放器显示模式:Full显示全部;mini最简化;None不显示播放控制,只显示视频窗口;invisible全部不显示--&gt; <br />&lt;param name="windowlessVideo" value="0"&gt; <br />&lt;!--如果是0可以允许全屏,否则只能在窗口中查看--&gt; <br />&lt;param name="fullScreen" value="0"&gt; <br />&lt;!--开始播放是否自动全屏--&gt; <br />&lt;param name="enableErrorDialogs" value="-1"&gt; <br />&lt;!--是否启用错误提示报告--&gt; <br />&lt;param name="SAMIStyle" value&gt; <br />&lt;!--SAMI样式--&gt; <br />&lt;param name="SAMILang" value&gt; <br />&lt;!--SAMI语言--&gt; <br />&lt;param name="SAMIFilename" value&gt; <br />&lt;!--字幕ID--&gt; <br />&lt;/object&gt;</div>
						<strong>常用的方法和属性：</strong>
						<div class="code">//基本属性<br />URL:String; 指定媒体位置，本机或网络地址<br />uiMode:String; 播放器界面模式，可为Full, Mini, None, Invisible<br />playState:integer; 播放状态，1=停止，2=暂停，3=播放，6=正在缓冲，9=正在连接，10=准备就绪<br />enableContextMenu:Boolean; 启用/禁用右键菜单（也是简单的防盗链方法）<br />fullScreen:boolean; 是否全屏显示<br /><br />//播放器控制属性<br />controls.play; 播放<br />controls.pause; 暂停<br />controls.stop; 停止<br />controls.currentPosition:double; 当前进度<br />controls.currentPositionString:string; 当前进度，字符串格式。如“00:23”<br />controls.fastForward; 快进<br />controls.fastReverse; 快退<br />controls.next; 下一曲<br />controls.previous; 上一曲<br />*注：上一曲和下一曲属性一般不能使用，因为这种功能是对一个播放列表气作用的，而对于新版本的播放器，js脚本一般没有权限去新建和修改播放列表的。只能自己去设计一个播放列表，自己去修改url属性去选曲。<br /><br />//播放器基本属性<br />settings.volume:integer; 音量，0-100<br />settings.autoStart:Boolean; 是否自动播放<br />settings.mute:Boolean; 是否静音<br />settings.playCount:integer; 播放次数<br /><br />//当前播放媒体的属性<br />currentMedia.duration:double; 媒体总长度<br />currentMedia.durationString:string; 媒体总长度，字符串格式。如“03:24”<br />currentMedia.getItemInfo(const
string);
获取当前媒体信息"Title"=媒体标题，"Author"=艺术家，"Copyright"=版权信息，"Description"=媒体内容描
述，"Duration"=持续时间（秒），"FileSize"=文件大小，"FileType"=文件类型，"sourceURL"=原始地址<br />currentMedia.setItemInfo(const string); 通过属性名设置媒体信息<br />currentMedia.name:string; 同 currentMedia.getItemInfo("Title")<br />[currentPlaylist] wmp.currentPlaylist //当前播放列表属性<br />currentPlaylist.count:integer; 当前播放列表所包含媒体数<br />currentPlaylist.Item[integer]; 获取或设置指定项目媒体信息，其子属性同wmp.currentMedia<br /><br />//最后是一些很少用到的参数和属性<br />AllowChangeDisplaySize 返回或设置最终用户是否能设置显示尺寸(逻辑型)<br />AllowScan 返回或设置是否允许扫描(逻辑型)<br />AnimationAtStart 返回或设置控件开始播放之前是否先播放一个动画序列(逻辑型)<br />AudioStream 返回或设置音频流的编号(用于多音频流的剪辑，默认为-1)(长整型)<br />AutoRewind 返回或设置媒体文件播放完毕后是否自动回绕(逻辑型)<br />AutoSize 返回或设置是否自动调整控件大小来适应载入的媒体(逻辑型)<br />AutoStart 返回或设置在载入媒体文件之后是否自动开始播放(逻辑型)<br />Balance 返回或设置指定立体声媒体文件的播放声道(-10000为左声道，10000为右声道，0为立体声)(长整型)<br />Bandwidth 返回或设置当前文件的带宽(长整型)<br />BaseURL 返回基本的 HTTP URL(字符串)<br />BufferingCount 返回媒体文件回放时缓冲的总时间(长整型)<br />BufferingProgress 返回缓冲完成的百分比(长整型)<br />BufferingTime 返回缓冲的时间(双精度型)<br />CanPreview 返回或设置当前显示的剪辑是能否被预览(逻辑型)<br />CanScan 返回或设置当前文件是否支持快进或快退(逻辑型)<br />CanSeek 返回或设置当前文件是否能搜索并定位到某个时间(逻辑型)<br />CanSeekToMarkers 返回或设置文件是否支持搜索到标签(逻辑型)<br />CaptioningID 返回在标题中显示的帧或控件的名称(字符串)<br />ChannelDescription 返回电台的描述(字符串)<br />ChannelName 返回电台的名称(字符串)<br />ChannelURL 返回电台的元文件的位置(字符串)<br />ClickToPlay 返回或设置是否可以通过点击图像暂停或播放剪辑(逻辑型)<br />ClientID 返回客户端唯一的标识符(字符串)<br />CodecCount 返回文件使用的可安装的 codecs 的个数(长整型)<br />ContactAddress 返回电台的联系地址(字符串)<br />ContactEmail 返回电台的联系电子邮件地址(字符串)<br />ContactPhone 返回电台的联系电话(字符串)<br />CreationDate 返回剪辑的创建日期(日期型)<br />CurrentMarker 返回或设置当前书签号码(长整型)<br />CurrentPosition 返回或设置剪辑的当前位置(双精度型)<br />CursorType 返回或设置指针类型(长整型)<br />DefaultFrame 返回或设置控件的默认目标 Http 帧(字符串)<br />DisplayBackColor 返回或设置显示面板的背景色(OLE_COLOR 值)<br />DisplayForeColor 返回或设置显示面板的前景色(OLE_COLOR 值)<br />DisplayMode 返回或设置显示面板是否用秒或帧的形式显示当前位置(MPDisplayModeConstants 值)<br />DisplaySize 返回或设置图像显示窗口的大小(MPDisplaySizeConstant 值)<br />Duration 返回或设置剪辑剪辑的播放时间(双精度型)<br />EnableContextMenu 返回或设置是否允许使用上下文菜单(逻辑型)<br />Enabled 返回或设置控件是否可用(逻辑型)<br />EnableFullScreenControls 返回或设置全屏幕控制是否可用(逻辑型)<br />EnablePositionControls 返回或设置位置控制是否可用(逻辑型)<br />EnableTracker 返回或设置搜索栏控制是否可用(逻辑型)<br />ErrorCode 返回当前错误代码(长整型)<br />ErrorCorrection 返回当前剪辑的错误修正类型(长整型)<br />ErrorDescription 返回当前错误的描述(字符串)<br />FileName 返回或设置要播放的剪辑的文件名称(字符串)<br />HasError 返回控件是否发生错误(逻辑型)<br />HasMultipleItems 返回或设置控件是否包含某些多重项目的内容(逻辑型)<br />ImageSourceHeight 返回或设置当前剪辑的原始图像高度(长整型)<br />ImageSourceWidth 返回或设置当前剪辑的原始图像宽度(长整型)<br />InvokeURLs 返回或设置 URL 是否自动发送请求(逻辑型)<br />IsBroadcast 返回或设置源是否进行广播(逻辑型)<br />IsDurationValid 返回或设置持续时间值是否有效(逻辑型)<br />Language 返回或设置用于本地化语言支持的当前区域语言(长整型)<br />LostPackets 返回丢失的数据包数量(长整型)<br />MarkerCount 返回文件书签的数量(长整型)<br />Mute 返回或设置控件是否播放声音(逻辑型)<br />OpenState 返回控件的内容源状态(长整型)<br />PlayCount 返回或设置一个剪辑播放的次数(长整型)<br />PlayState 返回控件的当前操作状态(长整型)<br />PreviewMode 返回或设置控件是否处在预览模式(逻辑型)<br />Rate 返回或设置回放帧频(双精度型)<br />ReadyState 返回控件是否准备就绪(ReadyStateConstant 值)<br />ReceivedPackets 返回已接收到的数据包的数量(长整型)<br />ReceptionQuality 返回最后 30 秒接收到的数据包的百分比(长整型)<br />RecoveredPackets 返回已转换的数据包的数量(长整型)<br />SAMIFileName 返回或设置 closed-captioning 文件名(字符串)<br />SAMILang 返回或设置 closed captioning 语言(字符串)<br />SAMIStyle 返回或设置 closed captioning 风格(字符串)<br />SelectionEnd 返回或设置流的结束位置(双精度型)<br />SelectionStart 返回或设置流的起始位置(双精度型)<br />SendErrorEvents 返回或设置控件是否发送错误事件(逻辑型)<br />SendKeyboardEvents 返回或设置控件是否发送键盘事件(逻辑型)<br />SendMouseClickEvents 返回或设置控件是否发送鼠标单击事件(逻辑型)<br />SendMouseMoveEvents 返回或设置控件是否发送鼠标移动事件(逻辑型)<br />SendOpenStateChangeEvents 返回或设置控件是否发送打开状态改变事件(逻辑型)<br />SendPlayStateChangeEvents 返回或设置控件是否发送播放状态改变事件(逻辑型)<br />SendWarningEvents 返回或设置控件是否发送警告事件(逻辑型)<br />ShowAudioControls 返回或设置是否显示音频控制(逻辑型)<br />ShowCaptioning 返回或设置是否显示字幕(逻辑型)<br />ShowControls 返回或设置控制面板是否可见(逻辑型)<br />ShowDisplay 返回或设置是否显示显示面板(逻辑型)<br />ShowGotoBar 返回或设置是否显示跳转栏(逻辑型)<br />ShowPositionControls 返回或设置是否显示位置控制(逻辑型)<br />ShowStatusBar 返回或设置是否显示状态栏(逻辑型)<br />ShowTracker 返回或设置是否显示搜索栏(逻辑型)<br />SourceLink 返回内容文件的路径(字符串)<br />SourceProtocol 返回用于接收数据的协议(长整型)<br />StreamCount 返回媒体帧的数量(长整型)<br />TransparentAtStart 返回或设置在开始播放之前和停止之后控件是否透明(逻辑型)<br />VideoBorder3D 返回或设置视频边框是否显示为 3D 效果(逻辑型)<br />VideoBorderColor 返回或设置视频边框的颜色(OLE_颜色)<br />VideoBorderWidth 返回或设置视频边框的宽度(长整型)<br />Volume 返回或设置音量(长整型)</div>
				</div>
		</div>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/61344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-09-10 14:50 <a href="http://www.cnitblog.com/seeyeah/archive/2009/09/10/61344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有关客户端浏览器缓存的Http头介绍</title><link>http://www.cnitblog.com/seeyeah/archive/2009/07/10/59991.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Fri, 10 Jul 2009 03:08:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/07/10/59991.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/59991.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/07/10/59991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/59991.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/59991.html</trackback:ping><description><![CDATA[
		<p>做网站开发离不开缓存，缓存分好多种：服务器缓存，第三方缓存，浏览器缓存等。其中浏览器缓存是代价最小的，因为浏览器缓存依赖的是客户端，而几乎不耗费服务器端的资源。</p>
		<p>让浏览器做缓存需要给浏览器发送指定的Http头，告诉浏览器缓存多长时间，或者坚决不要缓存。作为.net的程序员，其实我们一直都在用这种方法，在OutputCache指令中指定缓存的Location为Client时，其实就是给浏览器发送了一个Http头，告诉浏览器这个Url要缓存多长时间，最后修改的时间。</p>
		<p>微软在OutputCacheModule中对这些缓存用到的Http头给我们进行了很好的封装，但是了解这些Http头可以更灵活的使用它们。</p>
		<p>和客户端缓存相关的Http头有以下几个，分别是：<br /><strong>1. Expires:+过期时间</strong><br />表示在指定时间后浏览器缓存失效，需要注意的是这儿的过期时间必须是HTTP格式的日期时间，其他的都会被解析成当前时间“之前”，缓存会马上过期，HTTP的日期时间必须是格林威治时间（GMT），而不是本地时间。举例： <br />Expires: Fri, 30 Oct 2009 14:19:41</p>
		<p>使用Expires过期必须要求服务器的时间是正确的，否则发送的http头就会出问题，在windows服务下可以设置时间服务器来同步时间<br /><strong>2. Cache-control: <br /></strong>Cache-control直译成中文就是缓存控制，它的作用就是缓存控制，这个http头的值有几种。<br />1) max-age=[秒] — 执行缓存被认为是最新的最长时间。类似于过期时间，这个参数是基于请求时间的相对时间间隔，而不是绝对过期时间，[秒]是一个数字，单位是秒：从请求时间开始到过期时间之间的秒数。 <br />2) s-maxage=[秒] — 类似于max-age属性，除了他应用于共享（如：代理服务器）缓存 <br />3) public — 标记认证内容也可以被缓存，一般来说： 经过HTTP认证才能访问的内容，输出是自动不可以缓存的； <br />4) no-cache — 强制每次请求直接发送给源服务器，而不经过本地缓存版本的校验。这对于需要确认认证应用很有用（可以和public结合使用），或者严格要求使用最新数据的应用（不惜牺牲使用缓存的所有好处）； <br />5) no-store — 强制缓存在任何情况下都不要保留任何副本 <br />6) must-revalidate — 告诉缓存必须遵循所有你给予副本的新鲜度的，HTTP允许缓存在某些特定情况下返回过期数据，指定了这个属性，你高速缓存，你希望严格的遵循你的规则。 <br />7) proxy-revalidate — 和 must-revalidate类似，除了他只对缓存代理服务器起作用 <br />举例:<br />Cache-Control: max-age=3600, must-revalidate </p>
		<p>很显然Cache-control可以提供比Expires更灵活的缓存控制，而且它不需要依赖于服务器时间。<br />在Asp.Net中微软把对Cache-control属性的设置封装到了HttpCachePolicy类中，我们可以通过Response.Cache来调用以下方法来做到对Cache-Control Http头值的控制：<br />Response.CacheControl;<br />Response.Cache.SetNoStore<br />Response.Cache.SetMaxAge<br />Response.Cache.SetProxyMaxAge<br />Response.Cache.SetRevalidation<br />            <br /><strong>3. Last-Modified/If-Modified-Since <br /></strong>这两个Http头是一对，前者表示某个地址的最近更新时间，是服务器端响应给客户端的；而后者是客户端浏览器发送给服务器的，告诉web服务器客户端有一个最后更改时间为什么时间的缓存，服务器端接收到If-Modified-Since头后则判断客户端缓存的这份url地址的缓存是否是最新的，如果是最新的则服务器端直接给客户端返回HttpStatus 304，意思是说这个内容在你上次请求之后没有变化过，你直接用缓存就可以了；如果服务器发现url的最后更新时间比If-Modified-Since 的值要新，则会输出新的内容。</p>
		<p>同样微软也为我们做了服务器端设置的封装，我们可以这样调用<br />Response.Cache.SetLastModified(DateTime)<br />Response.Cache.SetLastModifiedFromFileDependencies()</p>
		<p>如果有更复杂的需求就需要自己处理了。</p>
		<p>
				<strong>4. ETag/If-None-Match</strong>
				<br />ETag和Last-Modified类似，不过他发送的是一个字符串来标示url的版本，如果url变了则此标示也跟着变化，在浏览器发送If-None-Match时告诉浏览器内容已经变了，或者没变可以使用缓存。</p>
		<p>Iis会自动给静态文件加上Etag，在文件发生改变时重新生成一个Etag，这样对于一个网站中的n多个静态文件如：样式表，小图片等，客户端只下载一次就够了，可以减轻负载。</p>
		<p>在Asp.Net中我们可以用以下两个方法来设置<br />Response.Cache.SetETag(string)<br />Response.Cache.SetETagFromFileDependencies()</p>
		<p>尽管微软为我们做了很多封装，但是我们还是需要详细的了解之后才可以用好这几个Http头。</p>
		<div id="MySignature">
				<hr color="#f0f0f0" noshade="" size="1" />
				<p>请尊重作者的劳动，转载请保留链接 <a href="http://www.cnblogs.com/yukaizhao/">玉开的技术博客</a>   </p>
		</div>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/59991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-07-10 11:08 <a href="http://www.cnitblog.com/seeyeah/archive/2009/07/10/59991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【摘至网上】Sql2005获取表结构</title><link>http://www.cnitblog.com/seeyeah/archive/2009/05/23/58722.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Sat, 23 May 2009 10:22:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/05/23/58722.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/58722.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/05/23/58722.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/58722.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/58722.html</trackback:ping><description><![CDATA[
		<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<span style="color: rgb(0, 0, 255);">SELECT</span>
				<span style="color: rgb(0, 0, 0);">  <br />表名               </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">CASE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">WHEN</span>
				<span style="color: rgb(0, 0, 0);">   A.COLORDER</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(128, 0, 0); font-weight: bold;">1</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">THEN</span>
				<span style="color: rgb(0, 0, 0);">   D.NAME   </span>
				<span style="color: rgb(0, 0, 255);">ELSE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">END</span>
				<span style="color: rgb(0, 0, 0);">,<br />表說明           </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">CASE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">WHEN</span>
				<span style="color: rgb(0, 0, 0);">   A.COLORDER</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(128, 0, 0); font-weight: bold;">1</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">THEN</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">ISNULL</span>
				<span style="color: rgb(0, 0, 0);">(F.VALUE, </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">)   </span>
				<span style="color: rgb(0, 0, 255);">ELSE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">END</span>
				<span style="color: rgb(0, 0, 0);">,<br />欄位序號       </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   A.COLORDER,<br />欄位名           </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   A.NAME,<br />標識               </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">CASE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">WHEN</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">COLUMNPROPERTY</span>
				<span style="color: rgb(0, 0, 0);">(   A.ID,A.NAME, </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);">ISIDENTITY </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">)</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(128, 0, 0); font-weight: bold;">1</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">THEN</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);">√ </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 255);">ELSE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">END</span>
				<span style="color: rgb(0, 0, 0);">,<br />主鍵               </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">CASE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">WHEN</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(128, 128, 128);">EXISTS</span>
				<span style="color: rgb(0, 0, 0);">(</span>
				<span style="color: rgb(0, 0, 255);">SELECT</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(128, 0, 0); font-weight: bold;">1</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">FROM</span>
				<span style="color: rgb(0, 0, 0);">   SYSOBJECTS   </span>
				<span style="color: rgb(0, 0, 255);">WHERE</span>
				<span style="color: rgb(0, 0, 0);">   XTYPE</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);">PK </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(128, 128, 128);">AND</span>
				<span style="color: rgb(0, 0, 0);">   PARENT_OBJ</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">A.ID   </span>
				<span style="color: rgb(128, 128, 128);">AND</span>
				<span style="color: rgb(0, 0, 0);">   NAME   </span>
				<span style="color: rgb(128, 128, 128);">IN</span>
				<span style="color: rgb(0, 0, 0);">   (<br /></span>
				<span style="color: rgb(0, 0, 255);">SELECT</span>
				<span style="color: rgb(0, 0, 0);">   NAME   </span>
				<span style="color: rgb(0, 0, 255);">FROM</span>
				<span style="color: rgb(0, 0, 0);">   SYSINDEXES   </span>
				<span style="color: rgb(0, 0, 255);">WHERE</span>
				<span style="color: rgb(0, 0, 0);">   INDID   </span>
				<span style="color: rgb(128, 128, 128);">IN</span>
				<span style="color: rgb(0, 0, 0);">(<br /></span>
				<span style="color: rgb(0, 0, 255);">SELECT</span>
				<span style="color: rgb(0, 0, 0);">   INDID   </span>
				<span style="color: rgb(0, 0, 255);">FROM</span>
				<span style="color: rgb(0, 0, 0);">   SYSINDEXKEYS   </span>
				<span style="color: rgb(0, 0, 255);">WHERE</span>
				<span style="color: rgb(0, 0, 0);">   ID   </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   A.ID   </span>
				<span style="color: rgb(128, 128, 128);">AND</span>
				<span style="color: rgb(0, 0, 0);">   COLID</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">A.COLID)))   </span>
				<span style="color: rgb(0, 0, 255);">THEN</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);">√ </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">ELSE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">END</span>
				<span style="color: rgb(0, 0, 0);">,<br />類型               </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   B.NAME,<br />佔用位元組數   </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   A.LENGTH,<br />長度               </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">COLUMNPROPERTY</span>
				<span style="color: rgb(0, 0, 0);">(A.ID,A.NAME, </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);">PRECISION </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">),<br />小數位數       </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">ISNULL</span>
				<span style="color: rgb(0, 0, 0);">(</span>
				<span style="color: rgb(255, 0, 255);">COLUMNPROPERTY</span>
				<span style="color: rgb(0, 0, 0);">(A.ID,A.NAME, </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);">SCALE </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">),</span>
				<span style="color: rgb(128, 0, 0); font-weight: bold;">0</span>
				<span style="color: rgb(0, 0, 0);">),<br />允許空           </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">CASE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">WHEN</span>
				<span style="color: rgb(0, 0, 0);">   A.ISNULLABLE</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(128, 0, 0); font-weight: bold;">1</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">THEN</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);">√ </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 255);">ELSE</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">END</span>
				<span style="color: rgb(0, 0, 0);">,<br />預設值           </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">ISNULL</span>
				<span style="color: rgb(0, 0, 0);">(E.</span>
				<span style="color: rgb(0, 0, 0); font-weight: bold;">TEXT</span>
				<span style="color: rgb(0, 0, 0);">, </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">),<br />欄位說明       </span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(255, 0, 255);">ISNULL</span>
				<span style="color: rgb(0, 0, 0);">(G.</span>
				<span style="color: rgb(255, 0, 0);">[</span>
				<span style="color: rgb(255, 0, 0);">VALUE</span>
				<span style="color: rgb(255, 0, 0);">]</span>
				<span style="color: rgb(0, 0, 0);">, </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">)<br /></span>
				<span style="color: rgb(0, 0, 255);">FROM</span>
				<span style="color: rgb(0, 0, 0);">  <br />SYSCOLUMNS   A<br /></span>
				<span style="color: rgb(255, 0, 255);">LEFT</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">JOIN</span>
				<span style="color: rgb(0, 0, 0);">  <br />SYSTYPES   B  <br /></span>
				<span style="color: rgb(0, 0, 255);">ON</span>
				<span style="color: rgb(0, 0, 0);">  <br />A.XUSERTYPE</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">B.XUSERTYPE<br /></span>
				<span style="color: rgb(0, 0, 255);">INNER</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">JOIN</span>
				<span style="color: rgb(0, 0, 0);">  <br />SYSOBJECTS   D  <br /></span>
				<span style="color: rgb(0, 0, 255);">ON</span>
				<span style="color: rgb(0, 0, 0);">  <br />A.ID</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">D.ID     </span>
				<span style="color: rgb(128, 128, 128);">AND</span>
				<span style="color: rgb(0, 0, 0);">   D.XTYPE</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);">U </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(128, 128, 128);">AND</span>
				<span style="color: rgb(0, 0, 0);">     D.NAME </span>
				<span style="color: rgb(128, 128, 128);">&lt;&gt;</span>
				<span style="color: rgb(0, 0, 0);"> </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(255, 0, 0);">DTPROPERTIES </span>
				<span style="color: rgb(255, 0, 0);">'</span>
				<span style="color: rgb(0, 0, 0);">
						<br />
				</span>
				<span style="color: rgb(255, 0, 255);">LEFT</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">JOIN</span>
				<span style="color: rgb(0, 0, 0);">  <br />SYSCOMMENTS   E  <br /></span>
				<span style="color: rgb(0, 0, 255);">ON</span>
				<span style="color: rgb(0, 0, 0);">  <br />A.CDEFAULT</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">E.ID<br /></span>
				<span style="color: rgb(255, 0, 255);">LEFT</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">JOIN</span>
				<span style="color: rgb(0, 0, 0);">  <br />sys.extended_properties   G  <br /></span>
				<span style="color: rgb(0, 0, 255);">ON</span>
				<span style="color: rgb(0, 0, 0);">  <br />A.ID</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">G.major_id   </span>
				<span style="color: rgb(128, 128, 128);">AND</span>
				<span style="color: rgb(0, 0, 0);">   A.COLID</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">G.minor_id    <br /></span>
				<span style="color: rgb(255, 0, 255);">LEFT</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">JOIN</span>
				<span style="color: rgb(0, 0, 0);">  <br />sys.extended_properties   F  <br /></span>
				<span style="color: rgb(0, 0, 255);">ON</span>
				<span style="color: rgb(0, 0, 0);">  <br />D.ID</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(0, 0, 0);">F.major_id   </span>
				<span style="color: rgb(128, 128, 128);">AND</span>
				<span style="color: rgb(0, 0, 0);">   F.minor_id</span>
				<span style="color: rgb(128, 128, 128);">=</span>
				<span style="color: rgb(128, 0, 0); font-weight: bold;">0</span>
				<span style="color: rgb(0, 0, 0);">
						<br />
				</span>
				<span style="color: rgb(0, 128, 128);">--</span>
				<span style="color: rgb(0, 128, 128);">where   d.name='pa_T_FORM_FI'         --如果只查询指定表,加上此条件  </span>
				<span style="color: rgb(0, 128, 128);">
						<br />
				</span>
				<span style="color: rgb(0, 0, 255);">ORDER</span>
				<span style="color: rgb(0, 0, 0);">   </span>
				<span style="color: rgb(0, 0, 255);">BY</span>
				<span style="color: rgb(0, 0, 0);">  <br />A.ID,A.COLORDER </span>
		</div>
		<br />
<img src ="http://www.cnitblog.com/seeyeah/aggbug/58722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-05-23 18:22 <a href="http://www.cnitblog.com/seeyeah/archive/2009/05/23/58722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在C#中生成指定长度的随机字符</title><link>http://www.cnitblog.com/seeyeah/archive/2009/05/12/57119.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Tue, 12 May 2009 02:30:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/05/12/57119.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/57119.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/05/12/57119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/57119.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/57119.html</trackback:ping><description><![CDATA[
		<p>摘至：http://www.cnblogs.com/nclly/archive/2008/12/19/1357961.html<br /></p>
		<p>
				<br />
		</p>
		<p>///&lt;summary&gt;<br />
///得到随机字符.<br />
///&lt;/summary&gt;<br />
///&lt;param name="intLength"&gt;Length of the int.&lt;/param&gt;<br />
///&lt;param name="booNumber"&gt;if set to &lt;c&gt;true&lt;/c&gt; [boo number].&lt;/param&gt;<br />
///&lt;param name="booSign"&gt;if set to &lt;c&gt;true&lt;/c&gt; [boo sign].&lt;/param&gt;<br />
///&lt;param name="booSmallword"&gt;if set to &lt;c&gt;true&lt;/c&gt; [boo smallword].&lt;/param&gt;<br />
///&lt;param name="booBigword"&gt;if set to &lt;c&gt;true&lt;/c&gt; [boo bigword].&lt;/param&gt;<br />
///&lt;returns&gt;&lt;/returns&gt;<br />
public string getRandomizer(int intLength, bool booNumber, bool booSign, bool booSmallword, bool booBigword)<br />
{<br />
 //定义<br />
 Random ranA = new Random();<br />
 int intResultRound = 0;<br />
 int intA = 0;<br />
 string strB = "";<br />
 while (intResultRound &lt; intLength)<br />
 {<br />
  //生成随机数A，表示生成类型<br />
  //1=数字，2=符号，3=小写字母，4=大写字母<br />
  intA = ranA.Next(1, 5);<br />
  //如果随机数A=1，则运行生成数字<br />
  //生成随机数A，范围在0-10<br />
  //把随机数A，转成字符<br />
  //生成完，位数+1，字符串累加，结束本次循环<br />
  if (intA == 1 &amp;&amp; booNumber)<br />
  {<br />
   intA = ranA.Next(0, 10);<br />
   strB = intA.ToString() + strB;<br />
   intResultRound = intResultRound + 1;<br />
   continue;<br />
  }<br />
  //如果随机数A=2，则运行生成符号<br />
  //生成随机数A，表示生成值域<br />
  //1：33-47值域，2：58-64值域，3：91-96值域，4：123-126值域<br />
  if (intA == 2 &amp;&amp; booSign == true)<br />
  {<br />
   intA = ranA.Next(1, 5);<br />
   //如果A=1<br />
   //生成随机数A，33-47的Ascii码<br />
   //把随机数A，转成字符<br />
   //生成完，位数+1，字符串累加，结束本次循环<br />
   if (intA == 1)<br />
   {<br />
    intA = ranA.Next(33, 48);<br />
    strB = ((char)intA).ToString() + strB;<br />
    intResultRound = intResultRound + 1;<br />
    continue;<br />
   }</p>
		<p>   //如果A=2<br />
   //生成随机数A，58-64的Ascii码<br />
   //把随机数A，转成字符<br />
   //生成完，位数+1，字符串累加，结束本次循环<br />
   if (intA == 2)<br />
   {<br />
    intA = ranA.Next(58, 65);<br />
    strB = ((char)intA).ToString() + strB;<br />
    intResultRound = intResultRound + 1;<br />
    continue;<br />
   }</p>
		<p>   //如果A=3<br />
   //生成随机数A，91-96的Ascii码<br />
   //把随机数A，转成字符<br />
   //生成完，位数+1，字符串累加，结束本次循环<br />
   if (intA == 3)<br />
   {<br />
    intA = ranA.Next(91, 97);<br />
    strB = ((char)intA).ToString() + strB;<br />
    intResultRound = intResultRound + 1;<br />
    continue;<br />
   }</p>
		<p>   //如果A=4<br />
   //生成随机数A，123-126的Ascii码<br />
   //把随机数A，转成字符<br />
   //生成完，位数+1，字符串累加，结束本次循环<br />
   if (intA == 4)<br />
   {<br />
    intA = ranA.Next(123, 127);<br />
    strB = ((char)intA).ToString() + strB;<br />
    intResultRound = intResultRound + 1;<br />
    continue;<br />
   }<br />
  }</p>
		<p>  //如果随机数A=3，则运行生成小写字母<br />
  //生成随机数A，范围在97-122<br />
  //把随机数A，转成字符<br />
  //生成完，位数+1，字符串累加，结束本次循环<br />
  if (intA == 3 &amp;&amp; booSmallword == true)<br />
  {<br />
   intA = ranA.Next(97, 123);<br />
   strB = ((char)intA).ToString() + strB;<br />
   intResultRound = intResultRound + 1;<br />
   continue;<br />
  }</p>
		<p>  //如果随机数A=4，则运行生成大写字母<br />
  //生成随机数A，范围在65-90<br />
  //把随机数A，转成字符<br />
  //生成完，位数+1，字符串累加，结束本次循环<br />
  if (intA == 4 &amp;&amp; booBigword == true)<br />
  {<br />
   intA = ranA.Next(65, 89);<br />
   strB = ((char)intA).ToString() + strB;<br />
   intResultRound = intResultRound + 1;<br />
   continue;<br />
  }<br />
 }<br />
 return strB;<br />
}</p>
		<p>//随机字符串生成器的主要功能如下： <br />
//1、支持自定义字符串长度<br />
//2、支持自定义是否包含数字<br />
//3、支持自定义是否包含小写字母<br />
//4、支持自定义是否包含大写字母<br />
//5、支持自定义是否包含特殊符号<br />
//6、支持自定义字符集</p>
		<p>///&lt;summary&gt;<br />
///生成随机字符串<br />
///&lt;/summary&gt;<br />
///&lt;param name="length"&gt;目标字符串的长度&lt;/param&gt;<br />
///&lt;param name="useNum"&gt;是否包含数字，1=包含，默认为包含&lt;/param&gt;<br />
///&lt;param name="useLow"&gt;是否包含小写字母，1=包含，默认为包含&lt;/param&gt;<br />
///&lt;param name="useUpp"&gt;是否包含大写字母，1=包含，默认为包含&lt;/param&gt;<br />
///&lt;param name="useSpe"&gt;是否包含特殊字符，1=包含，默认为不包含&lt;/param&gt;<br />
///&lt;param name="custom"&gt;要包含的自定义字符，直接输入要包含的字符列表&lt;/param&gt;<br />
///&lt;returns&gt;指定长度的随机字符串&lt;/returns&gt;<br />
public string GetRnd(int length, bool useNum, bool useLow, bool useUpp, bool useSpe, string custom)<br />
{<br />
 byte[] b = new byte[4];<br />
 new System.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(b);<br />
 Random r = new Random(BitConverter.ToInt32(b, 0));<br />
 string s = null, str = custom;<br />
 if (useNum == true) { str += "0123456789"; }<br />
 if (useLow == true) { str += "abcdefghijklmnopqrstuvwxyz"; }<br />
 if (useUpp == true) { str += "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; }<br />
 if (useSpe == true) { str += "!\"#$%&amp;'()*+,-./:;&lt;=&gt;?@[\\]^_`{|}~"; }<br />
 for (int i = 0; i &lt; length; i++)<br />
 {<br />
  s += str.Substring(r.Next(0, str.Length - 1), 1);<br />
 }<br />
 return s;<br />
}</p>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/57119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-05-12 10:30 <a href="http://www.cnitblog.com/seeyeah/archive/2009/05/12/57119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原】Sql2005 实现递归</title><link>http://www.cnitblog.com/seeyeah/archive/2009/03/25/55749.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Wed, 25 Mar 2009 13:26:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/03/25/55749.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/55749.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/03/25/55749.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/55749.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/55749.html</trackback:ping><description><![CDATA[现有数据结构如下图所示<br /><br /><img height="211" alt="sqlsnap1.jpg" src="http://www.cnitblog.com/images/cnitblog_com/seeyeah/sql1/sqlsnap1.jpg" width="380" border="0" /><br /><br />由U和U2，2个栏位，可以看出此示例数据表示着2条“链”。<br /><br />1、A =》B=》C=》D=》E<br />2、A1=》B1=》C1<br /><br />要搜出这样的数据，oracle有“connect by... start with”来遍历树结构，避免了写递归函数。<br /><br />SQL2005没有对应的函数，但使用SQL2005提供的CTE（Common Table Expression）可以实现“connect by... start with”的遍历。<br /><br />假设我们要找出第一条“链”（A =》B=》C=》D=》E）<br />Sql实现：<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">with</span><span style="COLOR: #000000"> custom_cte_query(id,u,u2)<br /></span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"><br />(<br />    </span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">起始条件</span><span style="COLOR: #008080"><br /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000"> id,u,u2 <br />    </span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000"> cte_test<br />    </span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000"> u </span><span style="COLOR: #808080">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">A</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">union</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080">all</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #008080">--</span><span style="COLOR: #008080">递归条件</span><span style="COLOR: #008080"><br /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000"> a.id,a.u,a.u2<br />    </span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000"> cte_test a<br />    </span><span style="COLOR: #0000ff">inner</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">join</span><span style="COLOR: #000000"> <br />    custom_cte_query b<br />    </span><span style="COLOR: #0000ff">on</span><span style="COLOR: #000000"> (a.u </span><span style="COLOR: #808080">=</span><span style="COLOR: #000000"> b.u2)<br />)<br /><br /></span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080">*</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000"> custom_cte_query</span></div><br />执行获得结果<br /><img height="138" alt="sqlsnap2.jpg" src="http://www.cnitblog.com/images/cnitblog_com/seeyeah/sql1/sqlsnap2.jpg" width="147" border="0" /><br /><br />参考： 
<div class="title">1、<a href="http://msdn.microsoft.com/zh-cn/library/ms186243(SQL.90).aspx" target="_blank">使用公用表表达式的递归查询<!----></a><br />2、<a href="http://msdn.microsoft.com/zh-cn/library/ms190766(SQL.90).aspx" target="_blank">使用公用表表达式</a></div><!--Content type: DocStudio. Transform: devdiv2mtps.xslt.--><img src ="http://www.cnitblog.com/seeyeah/aggbug/55749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-03-25 21:26 <a href="http://www.cnitblog.com/seeyeah/archive/2009/03/25/55749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分享 Threading in C# - Free E-book</title><link>http://www.cnitblog.com/seeyeah/archive/2009/03/20/55575.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Fri, 20 Mar 2009 02:29:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/03/20/55575.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/55575.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/03/20/55575.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/55575.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/55575.html</trackback:ping><description><![CDATA[
		<b>
				<u>
						<a target="_blank" href="http://www.albahari.com/threading/">Threading in C# </a>
				</u>
		</b>
		<br />
		<br />By <b>Joseph Albahari</b><br /><br /><b><u><a href="http://www.albahari.com/threading/threading.pdf">Download PDF</a></u></b><br /><img src ="http://www.cnitblog.com/seeyeah/aggbug/55575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-03-20 10:29 <a href="http://www.cnitblog.com/seeyeah/archive/2009/03/20/55575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原】Python Note 1</title><link>http://www.cnitblog.com/seeyeah/archive/2009/03/19/55531.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Wed, 18 Mar 2009 16:54:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/03/19/55531.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/55531.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/03/19/55531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/55531.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/55531.html</trackback:ping><description><![CDATA[<strong style="FONT-SIZE: 24pt">初步使用wx.aui.AuiManager构建界面</strong><br><br>在wxPython示例中，充分体验出AuiManager构建Layout的优势, 加以利用可以完全构建出类似visual studio的界面。<br><br><img height=621 alt="" src="http://www.cnitblog.com/images/cnitblog_com/seeyeah/pynote1/pyNote1.jpg" width=757 border=0><br><br>示例的布局太复杂&#8230;&#8230;第一次使用，尝试构建一个简单一点的界面练习，如下图<br><br><img height=600 alt="" src="http://www.cnitblog.com/images/cnitblog_com/seeyeah/pynote1/pyNote2.jpg" width=816 border=0><br><br>只有2个部分，左侧和中间内容。实现代码：<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">#</span><span style="COLOR: #008000">!/usr/bin/python</span><span style="COLOR: #008000"><br>#</span><span style="COLOR: #008000">&nbsp;coding=utf-8</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;wx<br></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;wx.aui;<br><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;MainUIHelper(object):<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">__init__</span><span style="COLOR: #000000">(self,&nbsp;frame):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;object.</span><span style="COLOR: #800080">__init__</span><span style="COLOR: #000000">(self);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.Frame&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;frame;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.Helper&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;self;<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;CreateAuiManager(self,&nbsp;configs):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(len(configs)&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;0):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">制造Layout</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.AuiManager&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;wx.aui.AuiManager();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.AuiManager.SetManagedWindow(self.Frame);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;c&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">&nbsp;configs:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.AuiManager.AddPane(c.Control,&nbsp;c.PaneInfo);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.AuiManager.Update();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;AuiConfigModel(object):<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">__init__</span><span style="COLOR: #000000">(self,&nbsp;control,&nbsp;paneInfo):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;object.</span><span style="COLOR: #800080">__init__</span><span style="COLOR: #000000">(self);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.Control&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;control;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.PaneInfo&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;paneInfo;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;</span></div>
<br>MainUIHelper是一个界面的辅助类，主要有几句：<br>1、
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">self.AuiManager.SetManagedWindow(self.Frame);</span></div>
告诉主界面，现在由AuiManager进行布局。<br>2、<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">self.AuiManager.AddPane(c.Control,&nbsp;c.PaneInfo);</span></div>
为布局添加模块，第一个参数为模块容器中的控件，第二个参数是模块容器的属性。<br>3、<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">self.AuiManager.Update();</span></div>
将所有的布局设置提交，类似数据库事务的Commit。<br><br>在主界面调用代码，如下图所示（只有部分）：<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">#</span><span style="COLOR: #008000">!/usr/bin/python</span><span style="COLOR: #008000"><br>#</span><span style="COLOR: #008000">&nbsp;coding=utf-8</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;wx<br></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;wx.aui;<br></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;wx.grid;<br></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;mainUIHelper;<br></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;start;<br></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;os;<br><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;MainUIFrame(wx.Frame):<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">__init__</span><span style="COLOR: #000000">(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.Frame.</span><span style="COLOR: #800080">__init__</span><span style="COLOR: #000000">(self,&nbsp;None,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">SqlQuery</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,pos</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">wx.DefaultPosition,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">500</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">400</span><span style="COLOR: #000000">),&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">wx.DEFAULT_FRAME_STYLE&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">wx.SUNKEN_BORDER&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">wx.CLIP_CHILDREN&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">初始化</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainUIHelper.MainUIHelper(self);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">绘画布局</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.Helper.CreateAuiManager([<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainUIHelper.AuiConfigModel(self.CreateLeft(),&nbsp;wx.aui.AuiPaneInfo()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Name(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">left</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">).Caption(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Script&nbsp;Folder</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">).Left()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.CloseButton(False)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.MaximizeButton(True)),&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainUIHelper.AuiConfigModel(self.CreateGrid(),&nbsp;wx.aui.AuiPaneInfo()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Name(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">gridContent</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">).CenterPane())]);</span></div>
<br>其中self.CreateLeft()和self.CreateGrid()只是返回一些控件，注意的是后面的AuiPaneInfo对象。<br><br>设置它属性的方式如jquery的&#8220;链式代码&#8221;，如<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">wx.aui.AuiPaneInfo()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Name(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">left</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">).Caption(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Script&nbsp;Folder</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">).Left()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.CloseButton(False)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.MaximizeButton(True)</span></div>
意思是<br>1、命名模块为"left"<br>2、标题为Script Folder<br>3、靠在布局的左边<br>4、不需要关闭模块按钮<br>5、显示最大化按钮<br><br>AuiPaneInfo还有很多属性可以设置，详细查看API。<br><br><br><strong style="FONT-SIZE: 24pt">遍历文件夹</strong><br><br>用Python实现遍历一个文件夹里面的内容，为了方便演示，把文件夹的内容构建一个树控件输出。<br><br>Python有一个os.walk(path)的函数，方便遍历文件夹内的内容。<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;root,&nbsp;dirs,&nbsp;files&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">&nbsp;os.walk(</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">Script</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000">&nbsp;root;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000">&nbsp;dirs;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000">&nbsp;files;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">---------</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">;</span></div>
<br>walk循环返回的是维度为3的数组，分别为<br>root - 当前循环的文件夹<br>dirs&nbsp; - 文件夹中有多少子文件夹<br>files&nbsp; - 文件夹中有多少文件<br><br>walk会自动递归搜索出所有文件和文件夹信息，因此一般情况用这个函数就可以非常省事。<br><br>也由于walk太智能的关系，用walk没有办法按我们的意愿，有顺序的输出文件信息，因此无法构建出想要的树控件。<br><br>因此摈弃了walk函数，用一个递归文件夹的函数。<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;listFile(path,&nbsp;action,&nbsp;level</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;os.path.isdir(path):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;action(path,&nbsp;True,&nbsp;level);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;subPath&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">&nbsp;os.listdir(path):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fullPath&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;os.path.join(path,&nbsp;subPath);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;os.path.isdir(fullPath):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listFile(fullPath,&nbsp;action,&nbsp;level&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;action(fullPath,&nbsp;False,&nbsp;level);</span></div>
<br>其中action是处理路径的方式，action有3个参数，第一个参数为路径；第二个参数为bool，True代表此路径为文件夹，False代表路径为文件；第三个参数是当前路径的相对层，设置根目录的层为0。<br><br>我们可以这样调用代码，输出文件夹文件。<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;listFile(path,&nbsp;action,&nbsp;level</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;os.path.isdir(path):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;action(path,&nbsp;True,&nbsp;level);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;subPath&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">&nbsp;os.listdir(path):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fullPath&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;os.path.join(path,&nbsp;subPath);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;os.path.isdir(fullPath):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listFile(fullPath,&nbsp;action,&nbsp;level&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;action(fullPath,&nbsp;False,&nbsp;level);<br><br><br></span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;showPath(path,&nbsp;isdir,&nbsp;level):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;isdir:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000">&nbsp;level&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">[D]:</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,path;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000">&nbsp;level&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">&nbsp;&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">&nbsp;,&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">[F]:</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,&nbsp;os.path.basename(path);<br><br><br>listFile(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Script</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,&nbsp;showPath);</span></div>
<br>输出的每个文件夹具有层次效果：<br><img height=411 alt="" src="http://www.cnitblog.com/images/cnitblog_com/seeyeah/pynote1/pyNote3.jpg" width=1002 border=0><br><br>同理，我们可以构造创建树控件的action函数。<br><br>我们紧接着第一个AuiManager的示例，在左边的Module创建添加这样的树控件，因此我们下面实现CreateLeft函数：<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;CreateLeft(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">""</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">遍历文件夹</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defaultScriptFolder&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;os.path.join(start.GetExecutePath(),</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">script</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">not</span><span style="COLOR: #000000">&nbsp;os.path.exists(defaultScriptFolder):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.mkdir(defaultScriptFolder);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.scriptTree&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;wx.TreeCtrl(self,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;(0,0),&nbsp;wx.DefaultSize,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.TR_DEFAULT_STYLE&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentRoot&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;self.scriptTree.AddRoot(os.path.basename(defaultScriptFolder));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">Key&nbsp;:&nbsp;path&nbsp;of&nbsp;folder</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">Node:&nbsp;TreeNode</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cacheNode&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{&nbsp;defaultScriptFolder:&nbsp;currentRoot&nbsp;};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;CreateNode(path,&nbsp;isdir,&nbsp;level):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;path&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;defaultScriptFolder:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentDirName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;os.path.dirname(path);<br></span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;parentDirName</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempNode&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;self.scriptTree.AppendItem(cacheNode[parentDirName],&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.path.basename(path));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;isdir:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cacheNode.setdefault(path,&nbsp;tempNode);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">pass</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ListFile(defaultScriptFolder,&nbsp;CreateNode);<br><br></span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;k,y&nbsp;in&nbsp;cacheNode.items():</span><span style="COLOR: #008000"><br>#</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;"%s:&nbsp;%s"%(k,y)</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">#</span><span style="COLOR: #008000">释放</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cacheNode.clear();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;self.scriptTree;&nbsp;&nbsp;&nbsp;&nbsp;<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;ListFile(self,&nbsp;path,&nbsp;action,&nbsp;level</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;os.path.isdir(path):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;action(path,&nbsp;True,&nbsp;level);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;subPath&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">&nbsp;os.listdir(path):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fullPath&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;os.path.join(path,&nbsp;subPath);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;os.path.isdir(fullPath):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ListFile(fullPath,&nbsp;action,&nbsp;level&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;action(fullPath,&nbsp;False,&nbsp;level);</span></div>
<br>创建了一个内部的函数，CreateNode，当作action参数传入ListFile递归调用。<br><br>效果如下图所示：<br><br><img height=535 alt="" src="http://www.cnitblog.com/images/cnitblog_com/seeyeah/pynote1/pyNote4.jpg" width=500 border=0><br><br><br>全部代码：<a href="http://www.cnitblog.com/Files/seeyeah/SqlQuery.zip">/Files/seeyeah/SqlQuery.zip</a><br>（注：Script文件夹的文件需要自己放置，任意放一些就可以显示效果。） 
<img src ="http://www.cnitblog.com/seeyeah/aggbug/55531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-03-19 00:54 <a href="http://www.cnitblog.com/seeyeah/archive/2009/03/19/55531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python 在线中文书</title><link>http://www.cnitblog.com/seeyeah/archive/2009/03/16/55472.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Mon, 16 Mar 2009 12:52:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/03/16/55472.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/55472.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/03/16/55472.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/55472.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/55472.html</trackback:ping><description><![CDATA[1、《wxPython in Action》<br><br><img height=251 alt="" src="http://wiki.woodpecker.org.cn/moin/WxPythonInAction?action=AttachFile&amp;do=get&amp;target=cover.jpg" width=200 border=0><br><br><a href="http://wiki.woodpecker.org.cn/moin/WxPythonInAction">http://wiki.woodpecker.org.cn/moin/WxPythonInAction</a><br><br>2、《Django Step by Step》<br><br><a href="http://www.woodpecker.org.cn/obp/django/django-stepbystep/newtest/doc/">http://www.woodpecker.org.cn/obp/django/django-stepbystep/newtest/doc/</a><br><br>3、《The Django Book》<br><br><a href="http://djangobook.py3k.cn/">http://djangobook.py3k.cn/<br></a><br>
<hr>
<br>PS：觉得这些开源社区的人，真的很无私，很伟大！
<img src ="http://www.cnitblog.com/seeyeah/aggbug/55472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-03-16 20:52 <a href="http://www.cnitblog.com/seeyeah/archive/2009/03/16/55472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python源码中中文注释的处理</title><link>http://www.cnitblog.com/seeyeah/archive/2009/03/15/55441.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Sun, 15 Mar 2009 06:12:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/03/15/55441.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/55441.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/03/15/55441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/55441.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/55441.html</trackback:ping><description><![CDATA[摘至：<a href="http://hi.baidu.com/tiger%5Ftnt/blog/item/e004e44e0ecaf20fb3de058d.html">http://hi.baidu.com/tiger%5Ftnt/blog/item/e004e44e0ecaf20fb3de058d.html</a><br><br>在python源码中如果使用了中文注释运行时会有错误，解决的办法是在源码的开头部分加入字符编码的声明，下面是一个例子<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">#</span><span style="COLOR: #008000">!/usr/bin/python</span><span style="COLOR: #008000"><br>#</span><span style="COLOR: #008000">&nbsp;coding=gbk</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">Hello&nbsp;World</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">&nbsp;＃这里可以是中文注释&nbsp;</span></div>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/55441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-03-15 14:12 <a href="http://www.cnitblog.com/seeyeah/archive/2009/03/15/55441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python import模块方法 </title><link>http://www.cnitblog.com/seeyeah/archive/2009/03/15/55440.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Sun, 15 Mar 2009 05:18:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/03/15/55440.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/55440.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/03/15/55440.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/55440.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/55440.html</trackback:ping><description><![CDATA[<p><span style="COLOR: #009999"><strong>python</strong></span>包含子目录中的模块方法比较简单，关键是能够在sys.path里面找到通向模块文件的路径。<br>下面将具体介绍几种常用情况:<br>（1）主程序与模块程序在同一目录下:<br>如下面程序结构:<br>`-- src<br>&nbsp;&nbsp;&nbsp; |-- mod1.py<br>&nbsp;&nbsp;&nbsp; `-- test1.py<br>&nbsp;&nbsp;&nbsp; 若在程序test1.py中导入模块mod1, 则直接使用<strong><span style="COLOR: #009999">import</span></strong> mod1或from mod1 import *;<br><br>（2）主程序所在目录是模块所在目录的父(或祖辈)目录<br>如下面程序结构:<br>`-- src<br>&nbsp;&nbsp;&nbsp; |-- mod1.py<br>&nbsp;&nbsp;&nbsp; |-- mod2<br>&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; `-- mod2.py<br>&nbsp;&nbsp;&nbsp; `-- test1.py<br>&nbsp;&nbsp;&nbsp; 若在程序test1.py中导入模块mod2, 需要在mod2文件夹中建立空文件__init__.py文件(也可以在该文件中自定义输出模块接口); 然后使用 from mod2.mod2 import * 或import mod2.mod2.<br><br>（3）主程序导入上层目录中模块或其他目录(平级)下的模块<br>如下面程序结构:<br>`-- src<br>&nbsp;&nbsp;&nbsp; |-- mod1.py<br>&nbsp;&nbsp;&nbsp; |-- mod2<br>&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; `-- mod2.py<br>&nbsp;&nbsp;&nbsp; |-- sub<br>&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; `-- test2.py<br>&nbsp;&nbsp;&nbsp; `-- test1.py<br>&nbsp;&nbsp;&nbsp; 若在程序test2.py中导入模块mod1和mod2。首先需要在mod2下建立__init__.py文件(同(2))，src下不必建立该文件。然后调用方式如下:<br>&nbsp;&nbsp; 下面程序执行方式均在程序文件所在目录下执行，如test2.py是在cd sub;之后执行python test2.py<br>而test1.py是在cd src;之后执行python test1.py; 不保证在src目录下执行python sub/test2.py成功。<br>&nbsp;&nbsp; import sys<br>&nbsp;&nbsp; sys.path.append("..")<br>&nbsp;&nbsp; import mod1<br>&nbsp;&nbsp; import mod2.mod2<br><br>&nbsp;（4）从(3)可以看出，导入模块关键是能够根据sys.path环境变量的值，找到具体模块的路径。这里仅介绍上面三种简单情况。<br>来自:http://hi.chinaunix.net/?253639/viewspace-25422</p><img src ="http://www.cnitblog.com/seeyeah/aggbug/55440.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-03-15 13:18 <a href="http://www.cnitblog.com/seeyeah/archive/2009/03/15/55440.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原】实现表达式的计算 （续）</title><link>http://www.cnitblog.com/seeyeah/archive/2009/02/20/54773.html</link><dc:creator>KiMoGiGi</dc:creator><author>KiMoGiGi</author><pubDate>Fri, 20 Feb 2009 14:17:00 GMT</pubDate><guid>http://www.cnitblog.com/seeyeah/archive/2009/02/20/54773.html</guid><wfw:comment>http://www.cnitblog.com/seeyeah/comments/54773.html</wfw:comment><comments>http://www.cnitblog.com/seeyeah/archive/2009/02/20/54773.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/seeyeah/comments/commentRss/54773.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/seeyeah/services/trackbacks/54773.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 18pt"><strong>1、Previously</strong></span><br><br>在<a id=viewpost1_TitleUrl href="http://www.cnitblog.com/seeyeah/archive/2009/02/18/54673.html"><font color=#3f3d3d><u>【原】实现表达式的计算</u></font></a> 中，用Stack解决了问题。<br><br>但单单对于解决此问题的话，直接用.net的Emit，简单的一些API就可以解决计算表达式的问题。<br><br><span style="FONT-SIZE: 18pt"><strong>2、Logic</strong></span><br><br>逻辑很简单，传入表达式并且只有+、-、&#215;、/、(、)的话，写代码表达式其实就可以直接计算出结果。<br><br>如：字符串表达式&#8220;1+4+7+(6*2*(4+3)+6-5)+2&#8221;。<br><br>假设我们对应生成一个方法，如下<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">decimal</span><span style="COLOR: #000000">&nbsp;GetResult()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br>}</span></div>
<br>获得的返回值就是计算结果。那么问题就简化成，怎么把代码字符串动态编译成assembly，从而用反射调用。<br><br><span style="FONT-SIZE: 18pt"><strong>3、Implement</strong></span><br><br>首先我们先定义一个接口：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">interface</span><span style="COLOR: #000000">&nbsp;IMock&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">decimal</span><span style="COLOR: #000000">&nbsp;Go();<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br>在正常情况，我们使用反射调用一个方法的时候，会写类似以下的代码：<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">MethodInfo&nbsp;methodInfo&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mockInstance.GetType().GetMethod(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Go</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;Convert.ToDecimal(methodInfo.Invoke(mockInstance,&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">));</span></div>
<br>由于Invoke速度较慢，这个接口的作用在于，可以避免使用反射调用方法，从而加快速度。<br><br>以下是具体实现功能的类：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;EmitCalculate<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;缓存表达式与计算实例<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;remarks&gt;</span><span style="COLOR: #008000">可避免对应相同的表达式重复动态编译</span><span style="COLOR: #808080">&lt;/remarks&gt;</span><span style="COLOR: #808080"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;Dictionary</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">,&nbsp;IMock</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;cacheInstances&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Dictionary</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">,&nbsp;IMock</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">decimal</span><span style="COLOR: #000000">&nbsp;Calculate(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;expression)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IMock&nbsp;mockInstance&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">cacheInstances.ContainsKey(expression))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">计算编译耗费的时间</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stopwatch&nbsp;sw&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Stopwatch.StartNew();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CSharpCodeProvider&nbsp;csProvider&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;CSharpCodeProvider();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CompilerParameters&nbsp;paras&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;CompilerParameters();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paras.GenerateExecutable&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paras.GenerateInMemory&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paras.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;code&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">@"</span><span style="COLOR: #000000"><br>public&nbsp;class&nbsp;Mock:ExpressionCalculate.IMock<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;decimal&nbsp;Go()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;#code#;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">编译代码。&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CompilerResults&nbsp;result&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;csProvider.CompileAssemblyFromSource(paras,&nbsp;code.Replace(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">#code#</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;expression));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获取编译后的程序集，并获取实例存放到缓存中</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cacheInstances.Add(expression,&nbsp;(IMock)result.CompiledAssembly.CreateInstance(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Mock</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sw.Stop();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Complier&nbsp;Time:{0}</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;sw.ElapsedMilliseconds);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mockInstance&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;cacheInstances[expression];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;mockInstance.Go();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br>根据表达式，动态构造Mock类，当然Mock类需要继承IMock。简单清楚就可以返回表达式的计算值。<br><br><span style="FONT-SIZE: 18pt"><strong>4、Full View</strong></span><br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System;<br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Collections.Generic;<br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;Microsoft.CSharp;<br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.CodeDom.Compiler;<br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Reflection;<br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Diagnostics;<br><br></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;ExpressionCalculate<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">interface</span><span style="COLOR: #000000">&nbsp;IMock&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">decimal</span><span style="COLOR: #000000">&nbsp;Go();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;EmitCalculate<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;缓存表达式与计算实例<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;remarks&gt;</span><span style="COLOR: #008000">可避免对应相同的表达式重复动态编译</span><span style="COLOR: #808080">&lt;/remarks&gt;</span><span style="COLOR: #808080"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;Dictionary</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">,&nbsp;IMock</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;cacheInstances&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Dictionary</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">,&nbsp;IMock</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">decimal</span><span style="COLOR: #000000">&nbsp;Calculate(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;expression)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IMock&nbsp;mockInstance&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">cacheInstances.ContainsKey(expression))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">计算编译耗费的时间</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stopwatch&nbsp;sw&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Stopwatch.StartNew();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CSharpCodeProvider&nbsp;csProvider&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;CSharpCodeProvider();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CompilerParameters&nbsp;paras&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;CompilerParameters();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paras.GenerateExecutable&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paras.GenerateInMemory&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paras.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;code&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">@"</span><span style="COLOR: #000000"><br>public&nbsp;class&nbsp;Mock:ExpressionCalculate.IMock<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;decimal&nbsp;Go()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;#code#;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">编译代码。&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CompilerResults&nbsp;result&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;csProvider.CompileAssemblyFromSource(paras,&nbsp;code.Replace(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">#code#</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;expression));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获取编译后的程序集，并获取实例存放到缓存中</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cacheInstances.Add(expression,&nbsp;(IMock)result.CompiledAssembly.CreateInstance(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Mock</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sw.Stop();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Complier&nbsp;Time:{0}</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;sw.ElapsedMilliseconds);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mockInstance&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;cacheInstances[expression];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;mockInstance.Go();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span></div>
<br>调用：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;expression&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1+4+7+(6*2*(4+3)+6-5)+2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cnitblog.com/Images/OutliningIndicators/None.gif" align=top>EmitCalculate.Calculate(expression);</span></div>
<br><strong style="FONT-SIZE: 18pt">5、Summary</strong><br><br>这种方法耗费比较多的时间在在编译上，编译后执行使用了接口类型，没有用反射调用方法，速度也是很快的。<br><br><br>
<img src ="http://www.cnitblog.com/seeyeah/aggbug/54773.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/seeyeah/" target="_blank">KiMoGiGi</a> 2009-02-20 22:17 <a href="http://www.cnitblog.com/seeyeah/archive/2009/02/20/54773.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>