﻿<?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>博客园-空空儿</title><link>http://www.cnblogs.com/doll-net/</link><description>Don't cry because it came to an end,smile because it happened. </description><language>zh-cn</language><lastBuildDate>Mon, 06 Oct 2008 17:49:19 GMT</lastBuildDate><pubDate>Mon, 06 Oct 2008 17:49:19 GMT</pubDate><ttl>60</ttl><item><title>在C#里使用属性</title><link>http://www.cnblogs.com/doll-net/archive/2008/06/28/Using_Attribute_In_CSharp.html</link><dc:creator>空空儿</dc:creator><author>空空儿</author><pubDate>Sat, 28 Jun 2008 09:09:00 GMT</pubDate><guid>http://www.cnblogs.com/doll-net/archive/2008/06/28/Using_Attribute_In_CSharp.html</guid><wfw:comment>http://www.cnblogs.com/doll-net/comments/1231697.html</wfw:comment><comments>http://www.cnblogs.com/doll-net/archive/2008/06/28/Using_Attribute_In_CSharp.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/doll-net/comments/commentRss/1231697.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/doll-net/services/trackbacks/1231697.html</trackback:ping><description><![CDATA[原文:<font face="Verdana"><a href="http://www.codeguru.com/Csharp/Csharp/cs_syntax/attributes/article.php/c5831/" target="_blank">Using Attribute In C#</a></font> <br />
<strong>绪论<br />
</strong><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp; 属性是一种新的声明性信息.使用属性既可以定义设计级信息(例如一个帮助文件或一个文档链接)又可以定义运行时信息(例如使一个XML和一个类相关联).也可以使用属性创建"自描述"组件.通过此篇教程,我们将了解如何创建并附加属性到不同的程序实体,和在运行时如何找到属性信息.<br />
<span style="font-size: 10.5pt; font-family: 宋体"><strong>定义<br />
</strong>&nbsp;&nbsp;&nbsp;MSDN的描述是(ms-help://MS.MSDNQTR.2002APR.1033/csspec/html/vclrfcsharpspec_17_2.htm):<font face="Verdana">"属性是附加说明的信息,既一个声明的详细说明".<br />
<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><strong>使用预定义属性</strong><br />
&nbsp;&nbsp;<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">在<span lang="EN-US">C#</span>里有一小部分预定义属性<span lang="EN-US">.</span>在学习如何创建我们自定义属性前<span lang="EN-US">,</span>我们先看看如何在我们的代码里使用那些属性<span lang="EN-US">.&nbsp;
<div class="cnblogs_code"><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;AnyClass<br />
{<br />
&nbsp;&nbsp;[Obsolete(</span><span style="color: #800000">"</span><span style="color: #800000">Don't&nbsp;use&nbsp;Old&nbsp;method,&nbsp;use&nbsp;New&nbsp;method</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">)]<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Old(&nbsp;)&nbsp;{&nbsp;}<br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;New(&nbsp;)&nbsp;{&nbsp;}<br />
<br />
&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">void</span><span style="color: #000000">&nbsp;Main(&nbsp;)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Old(&nbsp;);<br />
&nbsp;&nbsp;}<br />
}<br />
</span></div>
</span></span></span></font></span></font>&nbsp;&nbsp;&nbsp; 在<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">这个例子里<span lang="EN-US">.</span>我们使用<span lang="EN-US">Obsolete</span>属性<span lang="EN-US">,</span>标记一个不应再使用的程序实体<span lang="EN-US">.</span>第一个参数是字符串<span lang="EN-US">,</span>用来说明项为什么被作废和用什么代替<span lang="EN-US">.</span>事实上<span lang="EN-US">,</span>可以在这里写任何内容<span lang="EN-US">.</span>第二个参数告诉编译器应将使用这项的地方当作一个错误<span lang="EN-US">.</span>该参数的默认值是<span lang="EN-US">false,</span>这意味着编译器会生成一个警告<span lang="EN-US">.<br />
&nbsp;&nbsp; <span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">当我们试图编译上面的程序<span lang="EN-US">,</span>我们将得到一个错误<span lang="EN-US">:<br />
&nbsp;&nbsp; AnyClass.Old()' is obsolete: 'Don't use Old method, use New method'<br />
<span style="font-size: 10.5pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><strong>开发自定义属性<br />
</strong>&nbsp;&nbsp; </span></span></span></span></span><font face="宋体">现在,我们将了解如何开发自己的属性.这里有个创建自定义属性的小窍门.<br />
&nbsp;&nbsp; <font face="宋体">按C#语言规范,将我们的属性类继承自System. Attribute就完成了我们的自定义属性(继承自抽象类System. Attribute,就直接或间接的成为一个属性类.属性类的声明从理论上定义了一种可被置于声明上的新属性).<br />
</font></font>
<div class="cnblogs_code"><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelpAttribute&nbsp;:&nbsp;Attribute<br />
{<br />
}</span></div>
&nbsp;&nbsp;&nbsp; <font face="Verdana">不管你是否相信,我们已经正确的创建了一个自定义属性.我们可以像使用Obsolete属性一样用上面的属性来装饰我们的类.<br />
<div class="cnblogs_code"><span style="color: #000000">[Help()]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;AnyClass<br />
{<br />
}</span></div>
</font>&nbsp;&nbsp;&nbsp; <font face="Verdana"><strong>Note</strong>:使用关键字Attribute作为属性类名的后缀是一个约定.但是,当我们将属性附加到程序实体上时可以不用包含Attribute后缀.编译器首先在System.Attribute里查找属性.如果没有找到,编译器将关键字Attribute加到指定的属性名后然后再查找.<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font face="Verdana">目前这个属性还没有什么用,让我们添加一些东西使它有用些.</font>&nbsp;<br />
<div class="cnblogs_code"><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelpAttribute&nbsp;:&nbsp;Attribute<br />
{<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;HelpAttribute(String&nbsp;Description_in)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.description&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Description_in;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;String&nbsp;description;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;Description<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.description;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
}<br />
[Help(</span><span style="color: #800000">"</span><span style="color: #800000">this&nbsp;is&nbsp;a&nbsp;do-nothing&nbsp;class</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;AnyClass<br />
{<br />
}</span></div>
</font>&nbsp;&nbsp; <font face="Verdana">在上面的例子里,我们在属性类里添加了一个属性(property),在下一节里我们将在运行时查找这个属性(Description).<br />
<strong><span style="font-size: 9pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">定义或控制自定义属性的用法</span></strong><br />
&nbsp;&nbsp; <font face="Verdana">AttributeUsage是另一个预定义类,这个类可以帮我们控制自定义属性类的使用.也就是说我们可以给自定义属性类定义属性.它说明了该如何使用一个自定义属性类.</font><br />
&nbsp;&nbsp;&nbsp;<font face="Verdana">在自定义属性上使用AttributeUsage时,可以对AttributeUsage的3个属性(properties)进行赋值.下面我们来讨论这3个属性(properties).<br />
</font></font><font face="Verdana"><strong>ValidOn<br />
</strong>&nbsp;&nbsp;&nbsp;<font face="Verdana">通过这个属性,我们可以定义自定义属性可以使用在那些程序体上. AttributeTargets枚举列出了属性可以使用的所有程序体.使用OR运算符可以联合使用多个AttributeTargets值.<br />
<strong><font face="Verdana">AllowMultiple</font><br />
</strong>&nbsp;&nbsp;&nbsp;</font></font><font face="Verdana">该属性(property)标明在同一个程序体上是否可以使用多个自定义属性.</font><br />
<strong><font face="Verdana">Inherited</font><br />
</strong>&nbsp;&nbsp; <font face="Verdana">此特性标志着属性是否可被从自定义属性类别中获得的类别所继承</font>.<br />
<br />
<span style="font-size: 10.5pt; color: black; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt">&nbsp;&nbsp;让我们来实践下</span><span lang="EN-US" style="font-size: 10.5pt; color: black; font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-fareast-font-family: 宋体">.</span><span style="font-size: 10.5pt; color: black; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt">我们将在</span><span lang="EN-US" style="font-size: 10.5pt; color: black; font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-fareast-font-family: 宋体">Help</span><span style="font-size: 10.5pt; color: black; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt">属性类上使用</span><span lang="EN-US" style="font-size: 10.5pt; color: black; font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-fareast-font-family: 宋体">AttrubuteUsage</span><span style="font-size: 10.5pt; color: black; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt">属性来控制</span><span lang="EN-US" style="font-size: 10.5pt; color: black; font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-fareast-font-family: 宋体">Help</span><span style="font-size: 10.5pt; color: black; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt">属性类的用法.<br />
<div class="cnblogs_code"><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
[AttributeUsage(AttributeTargets.Class),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AllowMultiple&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">,&nbsp;Inherited&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">&nbsp;]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelpAttribute&nbsp;:&nbsp;Attribute<br />
{<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;HelpAttribute(String&nbsp;Description_in)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.description&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Description_in;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;String&nbsp;description;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;Description<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.description;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
}</span></div>
</span><font face="宋体">&nbsp;&nbsp;首先,看看AttributeTargets.Class.它规定Help属性只能用在类上.这意味着下面的代码将产生一个错误:<br />
AnyClass.cs: Attribute 'Help' is not valid on this declaration type. It is valid on 'class' declarations only.<br />
&nbsp; 现在将它用在一个方法上.<br />
</font>
<div class="cnblogs_code"><font face="宋体"><span style="color: #000000">Help(</span><span style="color: #800000">"</span><span style="color: #800000">this&nbsp;is&nbsp;a&nbsp;do-nothing&nbsp;class</span><span style="color: #800000">"</span></font><font face="宋体"><span style="color: #000000">)]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span></font><font face="宋体"><span style="color: #000000">&nbsp;AnyClass<br />
{<br />
&nbsp;&nbsp;[Help(</span><span style="color: #800000">"</span><span style="color: #800000">this&nbsp;is&nbsp;a&nbsp;do-nothing&nbsp;method</span><span style="color: #800000">"</span><span style="color: #000000">)]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">error</span></font><span style="color: #008000"><br />
</span><font face="宋体"><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span></font><span style="color: #000000"><font face="宋体">&nbsp;AnyMethod()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;}<br />
}</font></span></div>
<font face="宋体">&nbsp;&nbsp; <font face="宋体">使用AttributeTargets.All可以允许Help属性应用在任何程序体上(可能值为: Assembly, Module, Class, Struct, Enum, Constructor, Method, Property, Field, Event, Interface, Parameter, Delegate, All = Assembly | Module | Class | Struct | Enum | Constructor | Method | Property | Field | Event | Interface | Parameter | Delegate, ClassMembers = Class | Struct | Enum | Constructor | Method | Property | Field | Event | Delegate | Interface)</font><br />
&nbsp;&nbsp; <font face="宋体">现在看看AllowMultiple=false. 它规定属性不能多次使用在同一个程序体上.</font><br />
<div class="cnblogs_code"><span style="color: #000000">[Help(</span><span style="color: #800000">"</span><span style="color: #800000">this&nbsp;is&nbsp;a&nbsp;do-nothing&nbsp;class</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
[Help(</span><span style="color: #800000">"</span><span style="color: #800000">it&nbsp;contains&nbsp;a&nbsp;do-nothing&nbsp;method</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;AnyClass<br />
{<br />
&nbsp;&nbsp;[Help(</span><span style="color: #800000">"</span><span style="color: #800000">this&nbsp;is&nbsp;a&nbsp;do-nothing&nbsp;method</span><span style="color: #800000">"</span><span style="color: #000000">)]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">error</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;AnyMethod()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;}<br />
}</span></div>
</font>&nbsp;&nbsp;&nbsp; <font face="Verdana">上面的代码产生一个编译时错误: AnyClass.cs: Duplicate 'Help' attribute<br />
&nbsp;&nbsp;&nbsp; <font face="Verdana">现在让我们来讨论下最后一个属性(property). 继承意味着当一个属性被置于基类上时同时也被由基类衍生出来的类别所继承,如果属性类的Inherited为true,改属性可被继承.但是,如果属性类的Inherited为false或没有指定,该属性不能被继承.<br />
&nbsp;&nbsp;&nbsp; <font face="Verdana">让我们来推想下面类关系的结果:<br />
<ul>
    <li>[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false ]
    <li>[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false ]
    <li>[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true ]
    <li>[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true ] </li>
</ul>
<p><strong>First Case<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp; <font face="Verdana">如果我们查找Derive类的Help属性,我们将找不到它的属性(attribute),因为inherited值为false.</font><br />
<strong>Second Case</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp; <font face="Verdana">与上例没有什么不同, inherited值也为false.<br />
<strong>Third Case</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp; <font face="Verdana">为了解释第3和第4个例子,让我们给Derive类添加和Base类相同的属性.<br />
</p>
<div class="cnblogs_code"><span style="color: #000000">[Help(</span><span style="color: #800000">"</span><span style="color: #800000">BaseClass</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Base<br />
{<br />
}<br />
[Help(</span><span style="color: #800000">"</span><span style="color: #800000">DeriveClass</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Derive&nbsp;:&nbsp;&nbsp;Base<br />
{<br />
}</span></div>
<p></font></font>&nbsp;&nbsp;&nbsp; <font face="Verdana">如果我们现在查找Help属性,我们将仅得到Drive类的属性,因为继承属性值为true,但是不允许多重属性,所以基类的Help属性被Derive类的Help属性覆盖了.<br />
<strong>Fourth Case<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;<font face="Verdana">在第4个例子里,当我们查找Derive类的Help属性时将得到所有的属性,因为继承和多重属性是被允许的.<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; <font face="Verdana"><strong>Note</strong>: AttributeUsage属性使用在继承自System.Attribute的类上才有效, AllowMultiple和Inherited默认都为false.<br />
<strong><span style="font-size: 9pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">定位参数对命名参数</span></strong><br />
&nbsp;&nbsp;&nbsp; <font face="Verdana">定位参数是属性构造函数的参数.它们是一种强制值,无论属性被置于何种程序实体,此参数都必须传递给构造函数.另方面,命名参数实际上使用的是可选的无参构造函数.<br />
&nbsp;&nbsp;&nbsp; <font face="Verdana">为了更详细的解释,让我们添加一些其他的属性(property)到Help属性类.</p>
<div class="cnblogs_code"><span style="color: #000000">[AttributeUsage(AttributeTargets.Class,AllowMultiple&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">,Inherited&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">)]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelpAttribute&nbsp;:&nbsp;Attribute<br />
{<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;HelpAttribute(String&nbsp;Description_in)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.description&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Description_in;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.version&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">No&nbsp;Version&nbsp;is&nbsp;defined&nbsp;for&nbsp;this&nbsp;class</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;String&nbsp;description;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;Description<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.description;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;String&nbsp;version;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;Version<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.version;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">if&nbsp;we&nbsp;ever&nbsp;want&nbsp;our&nbsp;attribute&nbsp;user&nbsp;to&nbsp;set&nbsp;this&nbsp;property,<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">we&nbsp;must&nbsp;specify&nbsp;set&nbsp;method&nbsp;for&nbsp;it</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.version&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
}<br />
[Help(</span><span style="color: #800000">"</span><span style="color: #800000">This&nbsp;is&nbsp;Class1</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Class1<br />
{<br />
}<br />
<br />
[Help(</span><span style="color: #800000">"</span><span style="color: #800000">This&nbsp;is&nbsp;Class2</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;Version&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">1.0</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Class2<br />
{<br />
}<br />
<br />
[Help(</span><span style="color: #800000">"</span><span style="color: #800000">This&nbsp;is&nbsp;Class3</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;Version&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">2.0</span><span style="color: #800000">"</span><span style="color: #000000">,Description&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">This&nbsp;is&nbsp;do-nothing&nbsp;class</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Class3<br />
{<br />
}</span></div>
</font></font></font></font></font></font></font></font>&nbsp;&nbsp;&nbsp; 当<font face="Verdana">我们查找Class1的Help属性和它的属性(properties),我们将得到:<br />
Help.Description : This is Class1 <br />
Help.Version :No Version is defined for this class&nbsp;<br />
&nbsp;&nbsp;&nbsp;<font face="Verdana">因为我们没有为Version属性(property)指定任何值,所以使用构造函数里给定的值.如果没有指定值,则使用类型的默认值(例如,在本例,默认值为0).<br />
&nbsp;&nbsp; <font face="Verdana">现在查找Class2的自定义属性及其属性(property)会得到如下结果:<br />
Help.Description : This is Class2 <br />
Help.Version : 1.0&nbsp;<br />
&nbsp;&nbsp; 不要为<font face="Verdana">可选参数使用多个构造函数.应使用命名参数替代.当我们在构造函数里给它们赋值,我们需要他们的名字,这就是我们称之为命名的原因.例如,在第2个例子里,我们这样定义Help属性类.<br />
<div class="cnblogs_code"><span style="color: #000000">[Help(</span><span style="color: #800000">"</span><span style="color: #800000">This&nbsp;is&nbsp;Class2</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;Version&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">1.0</span><span style="color: #800000">"</span><span style="color: #000000">)]</span></div>
</font></font></font></font>&nbsp;&nbsp;&nbsp; <font face="Verdana">在AttributeUsage例子里, ValidOn是定位参数, Inherited和AllowMultiple是命名参数.</font><br />
&nbsp;&nbsp;&nbsp; <font face="Verdana"><strong>Note</strong>:在属性的构造函数里给命名参数赋值,我们需要提供属性(property)的SET访问器.<br />
&nbsp;<span class="codeComment">'Version' : Named attribute argument can't be a read-only property</span><br />
&nbsp;&nbsp;&nbsp; <font face="Verdana">在Class3里查找Help属性及其属性(property)会得到什么结果呢?结果同样是编译时错误.<br />
'Description' : Named attribute argument can't be a read- only property<br />
&nbsp;&nbsp;&nbsp; <font face="Verdana">现在修改Hele属性类,为Description添加一个Set访问器.现在输出将是:<br />
Help.Description : This is do-nothing class Help.Version : 2.0&nbsp;<br />
&nbsp;&nbsp;&nbsp; <font face="Verdana">在后台发生的事情是:使用定位参数调用第一个构造函数,然后依次调用命名参数的Set访问器.构造器里赋的值被SET访问器里赋的值覆盖了.<br />
<strong><span style="font-size: 9pt; color: black; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt">参数类型</span></strong><br />
<span style="font-size: 10.5pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">属性类的参数类型被限制为下列类型</span><span lang="EN-US" style="font-size: 10.5pt; color: black; font-family: Verdana; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">:</span><br />
<ul>
    <li>bool, byte, char, double, float, int, long, short, string
    <li>System. Type
    <li>object
    <li>An enum type, provided that it and any types in which it is nested are publicly accessible
    <li>A one-dimensional array involving any of the types listed above </li>
</ul>
<p><strong><span style="font-size: 9pt; color: black; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt">属性标志符</span></strong><br />
&nbsp;&nbsp;&nbsp; <font face="Verdana">假如我们要将Help属性应用到整个程序集,出现的第一个问题是:我们需要确定Help属性放在哪里编译器才能识别这是应用在整个程序集上的?另一种情况:要将属性应用在一个有返回类型的方法上时.编译器如何识别这是应用在一个返回类型的方法上而不是所有的方法上?<br />
&nbsp;&nbsp;&nbsp; <font face="Verdana">我们使用属性标识符来解决这种模棱两可的问题.通过属性标识符,可以很明确地陈述要将属性应用于哪个实体.</font><br />
&nbsp;&nbsp;&nbsp; 例如:</p>
<div class="cnblogs_code"><span style="color: #000000">[assembly:&nbsp;Help(</span><span style="color: #800000">"</span><span style="color: #800000">this&nbsp;a&nbsp;do-nothing&nbsp;assembly</span><span style="color: #800000">"</span><span style="color: #000000">)]</span></div>
&nbsp;&nbsp;&nbsp; <font face="Verdana">在Help属性之前的Assembly标志符明确的告诉编译器当前属性应用于整个程序集,可能的标志符是:</font><br />
<ul>
    <li>assembly
    <li>module
    <li>type
    <li>method
    <li>property
    <li>event
    <li>field
    <li>param
    <li>return </li>
</ul>
<strong><span style="font-size: 9pt; color: black; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt">在运行时查找属性</span></strong><br />
&nbsp;&nbsp;&nbsp; <font face="Verdana">我们已经了解了如何创建属性并如何将它们应用到程序单元上.现在我们来学习如何在运行时查找这些信息.</font><br />
&nbsp;&nbsp;&nbsp; <font face="Verdana">我们可用.NET Framework的反射APIS通过程序集的元数据去迭代并生成由程序集所定义的包括所有类别,类型和方法的清单.</font><br />
&nbsp;&nbsp;&nbsp; <font face="Verdana">还记得前面的Help属性和AnyClass类吗?<br />
</font>
<div class="cnblogs_code"><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.Reflection;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Diagnostics;<br />
<br />
</span><span style="color: #008000">//</span><span style="color: #008000">attaching&nbsp;Help&nbsp;attribute&nbsp;to&nbsp;entire&nbsp;assembly</span><span style="color: #008000"><br />
</span><span style="color: #000000">[assembly&nbsp;:&nbsp;Help(</span><span style="color: #800000">"</span><span style="color: #800000">This&nbsp;Assembly&nbsp;demonstrates&nbsp;custom&nbsp;attributes creation and their run-time query."</span><span style="color: #800000">)]</span><span style="color: #000000"><br />
</span><span style="color: #008000">//</span><span style="color: #008000">our&nbsp;custom&nbsp;attribute&nbsp;class</span><span style="color: #008000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelpAttribute&nbsp;:&nbsp;Attribute<br />
{<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;HelpAttribute(String&nbsp;Description_in)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO:&nbsp;Add&nbsp;constructor&nbsp;logic&nbsp;here</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.description&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Description_in;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//<br />
</span><span style="color: #000000">&nbsp;&nbsp;}<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;String&nbsp;description;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;Description<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.description;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
}<br />
</span><span style="color: #008000">//</span><span style="color: #008000">attaching&nbsp;the&nbsp;Help&nbsp;attribute&nbsp;to&nbsp;our&nbsp;AnyClass</span><span style="color: #008000"><br />
</span><span style="color: #000000">[HelpString(</span><span style="color: #800000">"</span><span style="color: #800000">This&nbsp;is&nbsp;a&nbsp;do-nothing&nbsp;Class.</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;AnyClass<br />
{<br />
</span><span style="color: #008000">//</span><span style="color: #008000">attaching&nbsp;the&nbsp;Help&nbsp;attribute&nbsp;to&nbsp;our&nbsp;AnyMethod</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;[Help(</span><span style="color: #800000">"</span><span style="color: #800000">This&nbsp;is&nbsp;a&nbsp;do-nothing&nbsp;Method.</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;AnyMethod()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;}<br />
</span><span style="color: #008000">//</span><span style="color: #008000">attaching&nbsp;Help&nbsp;attribute&nbsp;to&nbsp;our&nbsp;AnyInt&nbsp;Field</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;[Help(</span><span style="color: #800000">"</span><span style="color: #800000">This&nbsp;is&nbsp;any&nbsp;Integer.</span><span style="color: #800000">"</span><span style="color: #000000">)]<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;AnyInt;<br />
}<br />
</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;QueryApp<br />
{<br />
&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">void</span><span style="color: #000000">&nbsp;Main()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;}<br />
}</span></div>
&nbsp;&nbsp;&nbsp; <font face="Verdana">在下2节我们将在Main方法里添加属性查找代码.</font><br />
<strong style="mso-bidi-font-weight: normal"><span style="font-size: 10.5pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">查找程序集属性</span></strong><br />
&nbsp;&nbsp;&nbsp; <font face="Verdana">在下面的代码里,我们获取当前进程名并使用Assembly类的LoadFrom方法加载程序集.然后,使用GetCustomAttributes方法获取当前程序集里附加的所有自定义属性.其次,遍历所有的属性并尝试将属性转换为Help属性(如果转换是不合法的,使用as关键字转换对象比较有利,我们不用担心会抛出异常,因为转化的结果值为NULL).跟随的行检查转换是否合法和转换结果是否为NULL,然后显示Help属性.</font><br />
<div class="cnblogs_code"><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;QueryApp<br />
{<br />
&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">void</span><span style="color: #000000">&nbsp;Main()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;HelpAttribute&nbsp;HelpAttr;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Querying&nbsp;Assembly&nbsp;Attributes</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;assemblyName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Process&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Process.GetCurrentProcess();<br />
&nbsp;&nbsp;&nbsp;&nbsp;assemblyName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p.ProcessName&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">.exe</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Assembly&nbsp;a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Assembly.LoadFrom(assemblyName);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">foreach</span><span style="color: #000000">&nbsp;(Attribute&nbsp;attr&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;a.GetCustomAttributes(</span><span style="color: #0000ff">true</span><span style="color: #000000">))<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelpAttr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;attr&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;HelpAttribute;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</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;HelpAttr)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">Description&nbsp;of&nbsp;{0}:\n{1}</span><span style="color: #800000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assemblyName,HelpAttr.Description);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
}</span></div>
<font face="Verdana">&nbsp;&nbsp;&nbsp; 上面的程序输出结果是:<br />
Description of QueryAttribute.exe: This Assembly demonstrates custom attributes creation and their run-time query. <br />
Press any key to continue. <br />
</font><strong><span style="font-size: 10.5pt; color: black; font-family: 宋体">查找类</span><span style="font-size: 10.5pt; color: black; font-family: Verdana">,</span><span style="font-size: 10.5pt; color: black; font-family: 宋体">方法</span><span style="font-size: 10.5pt; color: black; font-family: Verdana">,</span><span style="font-size: 10.5pt; color: black; font-family: 宋体">字段属性</span></strong><br />
&nbsp;&nbsp;&nbsp; <font face="Verdana">在下面的代码里,唯一陌生的东西就是Main方法的第一行.</font><br />
<div class="cnblogs_code"><span style="color: #000000">Type&nbsp;type&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">typeof</span><span style="color: #000000">(AnyClass);&nbsp;</span></div>
&nbsp;&nbsp;&nbsp; <font face="Verdana">使用typeof运算符获得AnyClass类的类型.其余的代码和前面的代码一样查找类里的属性,就不用再解释了.</font><br />
&nbsp;&nbsp;&nbsp; <font face="Verdana">要查找方法和字段的属性,首先需要获得类里定义的所有的方法和字段;然后像查找类属性一样查找相关联的属性.<br />
</font>
<div class="cnblogs_code"><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;QueryApp<br />
{<br />
&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">void</span><span style="color: #000000">&nbsp;Main()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;type&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">typeof</span><span style="color: #000000">(AnyClass);<br />
&nbsp;&nbsp;&nbsp;&nbsp;HelpAttribute&nbsp;HelpAttr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Querying&nbsp;Class&nbsp;Attributes</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">foreach</span><span style="color: #000000">&nbsp;(Attribute&nbsp;attr&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;type.GetCustomAttributes(</span><span style="color: #0000ff">true</span><span style="color: #000000">))<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelpAttr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;attr&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;HelpAttribute;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</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;HelpAttr)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">Description&nbsp;of&nbsp;AnyClass:\n{0}</span><span style="color: #800000">"</span><span style="color: #000000">,HelpAttr.Description);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Querying&nbsp;Class-Method&nbsp;Attributes</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">foreach</span><span style="color: #000000">(MethodInfo&nbsp;method&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;type.GetMethods())<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">foreach</span><span style="color: #000000">&nbsp;(Attribute&nbsp;attr&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;method.GetCustomAttributes(</span><span style="color: #0000ff">true</span><span style="color: #000000">))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelpAttr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;attr&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;HelpAttribute;<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">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;HelpAttr)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">Description&nbsp;of&nbsp;{0}:\n{1}</span><span style="color: #800000">"</span><span style="color: #000000">,method.Name,&nbsp;HelpAttr.Description);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Querying&nbsp;Class-Field&nbsp;(only&nbsp;public)&nbsp;Attributes</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">foreach</span><span style="color: #000000">(FieldInfo&nbsp;field&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;type.GetFields())<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">foreach</span><span style="color: #000000">&nbsp;(Attribute&nbsp;attr&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;field.GetCustomAttributes(</span><span style="color: #0000ff">true</span><span style="color: #000000">))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelpAttr</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;attr&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;HelpAttribute;<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">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;HelpAttr)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">Description&nbsp;of&nbsp;{0}:\n{1}</span><span style="color: #800000">"</span><span style="color: #000000">,field.Name,HelpAttr.Description);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
}</span></div>
&nbsp;&nbsp;&nbsp; <font face="Verdana">上面的程序输出的结果是:<br />
Description of AnyClass: This is a do-nothing Class. <br />
Description of AnyMethod: This is a do-nothing Method. <br />
Description of AnyInt: This is any Integer. <br />
Press any key to continue <br />
</font><br />
相关应用:<a target='_blank' href='http://www.c-sharpcorner.com/UploadFile/AquilaNonE/SQLAttributeReflection06112007090016AM/SQLAttributeReflection.aspx'>Generate SQL Statements with objects, Attributes and Reflection</a></font></font></font></font></font><img src ="http://www.cnblogs.com/doll-net/aggbug/1231697.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42809/" target="_blank">[新闻]51.COM技术副总裁邵辉跳槽百度</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Read text file (txt, csv, log, tab, fixed length)</title><link>http://www.cnblogs.com/doll-net/archive/2008/06/19/Read_text_file.html</link><dc:creator>空空儿</dc:creator><author>空空儿</author><pubDate>Thu, 19 Jun 2008 09:10:00 GMT</pubDate><guid>http://www.cnblogs.com/doll-net/archive/2008/06/19/Read_text_file.html</guid><wfw:comment>http://www.cnblogs.com/doll-net/comments/1226070.html</wfw:comment><comments>http://www.cnblogs.com/doll-net/archive/2008/06/19/Read_text_file.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/doll-net/comments/commentRss/1226070.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/doll-net/services/trackbacks/1226070.html</trackback:ping><description><![CDATA[<span style="font-size: 10.5pt; color: #000000; font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><strong>绪论</strong><br />
我们经常需要读取并处理文本文件的数据，通常是用<span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">StreamReader (.NET) / FileSystemObject (VB 6.0)逐行读取.<br />
<span style="font-family: 宋体">假如我们可以像查询数据库的表一样读取文件并处理数据</span>,<span style="font-family: 宋体">我们会发现上面的方法有一些劣势</span>.<br />
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一些劣势是</span><span lang="EN-US">:<br />
<font face="Verdana">&nbsp; 1.保持连接环境.一直锁住文件直到处理完毕.<br />
&nbsp; 2.<font face="Verdana">需要分隔每一行以得到部分列的数据.某些行的数据要是包含逗号处理起来就比较困难了.Example: &#8220;Yes, comma is here&#8221;,2,&#8221;Hello, another comma&#8221;,4,5,6</font><br />
&nbsp; 3.<font face="Verdana">在读完数据开始处理之前我们没有筛选数据的选项.<br />
&nbsp; 4.<font face="Verdana">要统计文件的记录条数或者统计包含特别类型的记录条数需要读完整个文件.</font><br />
<font face="Verdana">我们可以列举出更多的劣势.相对逐行读取的劣势而言使用数据库的表查询更有价值.<br />
<font face="Verdana">我们可以像读取一个数据库表一样读取文本文件吗?</font><br />
<font face="Verdana">如果答案是否定的也就没有这篇讨论的文章了.是的,我们可以像读取数据库表一样读取文件并且可以轻松克服前面提及的劣势.<br />
<strong>读取数据<br />
</strong><font face="Verdana">连接一个数据库并从表里查询数据是比较简单的.既然这样,我们就将文本文件当作表,将文件所在的目录当作数据库.<br />
<font face="Verdana">读取数据的步骤</font>:<br />
<font face="Verdana">&nbsp; 1.打开数据库连接<br />
&nbsp; <font face="Verdana">Note:这里的连接字符串很重要.它因我们要读的文件类型而有所不同.我们将在本文后面讨论.<br />
&nbsp; <font face="Verdana">2.使用基础查询语言获取结果集.</font><br />
&nbsp; <font face="Verdana">3.遍历结果集以读取字段.</font><br />
&nbsp;C# Code:
<div class="cnblogs_code"><span style="color: #000000">DataSet&nbsp;myData&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DataSet();<br />
</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;myXML;<br />
</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;strFilePath&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">C:\\</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;mySelectQuery&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">SELECT&nbsp;*&nbsp;FROM&nbsp;SampleFile.CSV</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
OleDbConnection&nbsp;myConnection&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;OleDbConnection(</span><span style="color: #800000">"</span><span style="color: #800000">Provider=Microsoft.Jet.OLEDB.4.0;Data&nbsp;Source=D:\\;</span><span style="color: #800000">"</span><span style="color: #000000">&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;&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: #800000">"</span><span style="color: #800000">Extended&nbsp;Properties=\</span><span style="color: #800000">"</span><span style="color: #000000">text;HDR</span><span style="color: #000000">=</span><span style="color: #000000">YES;FMT</span><span style="color: #000000">=</span><span style="color: #000000">Delimited\</span><span style="color: #800000">""</span><span style="color: #000000">);<br />
OleDbDataAdapter&nbsp;dsCmd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;OleDbDataAdapter(mySelectQuery,&nbsp;myConnection);<br />
</span><span style="color: #008000">//</span><span style="color: #008000">Fill&nbsp;the&nbsp;DataSet&nbsp;object</span><span style="color: #008000"><br />
</span><span style="color: #000000">dsCmd.Fill(myData,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">CustomerOwners</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008000">//</span><span style="color: #008000">Create&nbsp;a&nbsp;XML&nbsp;document&nbsp;with&nbsp;the&nbsp;table&nbsp;data</span><span style="color: #008000"><br />
</span><span style="color: #000000">myData.WriteXml(</span><span style="color: #800000">"</span><span style="color: #800000">D:\\TestXML.xml</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
myConnection.Close();<br />
</span></div>
</font></font></font></font></font></font></font></span></span></span>VB 6.0 code:<br />
<div class="cnblogs_code"><span style="color: #800000">'</span><span style="color: #800000">Set&nbsp;the&nbsp;database&nbsp;connection</span><span style="color: #800000"><br />
</span><span style="color: #000000">objConnection.Open&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Provider=Microsoft.Jet.OLEDB.4.0;</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</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;</span><span style="color: #800000">"</span><span style="color: #800000">Data&nbsp;Source=</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;strFilePath&nbsp;</span><span style="color: #000000">&amp;</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">&nbsp;</span><span style="color: #000000">&amp;</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;</span><span style="color: #800000">"</span><span style="color: #800000">Extended&nbsp;Properties=</span><span style="color: #800000">""</span><span style="color: #800000">text;HDR=YES;FMT=Delimited</span><span style="color: #800000">"""</span><span style="color: #000000"><br />
<br />
</span><span style="color: #800000">'</span><span style="color: #800000">Query&nbsp;from&nbsp;the&nbsp;file&nbsp;assuming&nbsp;it&nbsp;as&nbsp;a&nbsp;database&nbsp;table</span><span style="color: #800000"><br />
</span><span style="color: #000000">objRecordset.Open&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">SELECT&nbsp;*&nbsp;FROM&nbsp;</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;fileName,&nbsp;_<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objConnection,&nbsp;adOpenStatic,&nbsp;adLockOptimistic,&nbsp;adCmdText<br />
<br />
</span><span style="color: #800000">'</span><span style="color: #800000">Loop&nbsp;through&nbsp;the&nbsp;records&nbsp;and&nbsp;insert&nbsp;in&nbsp;to&nbsp;the&nbsp;table</span><span style="color: #800000"><br />
</span><span style="color: #000000">Do&nbsp;Until&nbsp;objRecordset.EOF<br />
&nbsp;&nbsp;&nbsp;&nbsp;Debug.Print&nbsp;objRecordset.Fields.Item(</span><span style="color: #800000">"</span><span style="color: #800000">Number</span><span style="color: #800000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Debug.Print&nbsp;objRecordset.Fields.Item(</span><span style="color: #800000">"</span><span style="color: #800000">Name</span><span style="color: #800000">"</span><span style="color: #000000">)<br />
objRecordset.MoveNext<br />
Loop</span></div>
<font face="Verdana">我们像读取数据库表一样读取文本文件.让我们来看看这种方法的优势:</font><br />
&nbsp; <font face="Verdana">1.这种处理比较快</font><br />
&nbsp;&nbsp;2.<font face="Verdana">首先要说明下它处理数据行并分离数据的的方式.假如你的文本的某一列包含里有一个逗号(上面列出的第2点劣势),程序将自动处理这种情况.我们不必处理这种个别情况.</font><br />
&nbsp; 3.<font face="Verdana">如果给定筛选标准我们可以查询出指定的记录行.</font><br />
&nbsp; <font face="Verdana">4.现在看来,很显然,在查询的时候可以使用非常有用的WHERE,HAVING或者GROUP子句<br />
&nbsp;&nbsp;&nbsp;&nbsp; Ex: "SELECT Number, Count(Name) FROM SampleFile1.CSV GROUP BY Number HAVING Count(Name) &gt;= 1"</font><br />
&nbsp; <font face="Verdana">5.我们可以基于条件过滤数据,一次性获取文件里符合条件的全部数据.这些可以使用 RowFilter/Filter属性 或 DataView/RecordSe完成.如我曾说过的,一旦我们将数据读到 Dataset/RecordSet,我们可以使用它们完成所有的操作.包括筛选,排序等..</font><br />
<font face="Verdana"><strong>其他文件格式<br />
</strong><font face="Verdana">我们讨论了读取使用逗号分隔的文件(CSV).那么如何使用这种方式处理TAB分隔的文件和固定长度的文件呢? 重点就是我们所提供的连接字符串。<br />
让我们来看看连接字符串的具体内容:<br />
<div class="cnblogs_code" style="width: 785px; height: 36px"><span style="color: #000000">Provider</span><span style="color: #000000">=</span><span style="color: #000000">Microsoft.Jet.OLEDB.</span><span style="color: #800080">4.0</span><span style="color: #000000">;Data&nbsp;Source</span><span style="color: #000000">=</span><span style="color: #000000">C:\FolderName;Extended&nbsp;Properties</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">text;HDR=YES;FMT=Delimited"</span></div>
<p><font face="Verdana">Provider &#8211; 代表数据库类型.我们使用OLEDB连接类型.<br />
Data Source &#8211; 文件夹被当作数据库.<br />
Extended Properties &#8211; 这些属性说明我们将使用哪种方式读取文件.</font><font face="Verdana"><br />
字符串的第一部分定义了文件类型.尽管文件格式可以分类为逗号分割,TAB分割或者固定长度的数据,但他们都是简单文本.如果我们读取EXCEL文件则需要使用EXCEL X.X,X.X是EXCEL的版本号.</font></p>
<ul>
    <li>HDR (Header) &#8211; <font face="Verdana">用来指定header(文件头)是否是可用的.YES - 文件的第一行被当作文件头,其他行是数据. NO - 数据从第一行开始.</font> FMT (Format) &#8211;<font face="Verdana">指定格式类型.可以是下面的值:</font><br />
    <table style="width: 84.59%; height: 185px" cellspacing="1" cellpadding="1" align="center" border="1">
        <tbody>
            <tr>
                <td style="width: 50%">Delimited </td>
                <td style="width: 50%"><font face="Verdana">数据以逗号分割的文件.逗号是默认的分割符.</font></td>
            </tr>
            <tr>
                <td style="width: 50%">Delimited(x) </td>
                <td style="width: 50%"><font face="Verdana">数据以'X'分割符分割的文件</font>. </td>
            </tr>
            <tr>
                <td style="width: 50%">TabDelimited </td>
                <td style="width: 50%"><font face="Verdana">数据以TAB分割的文件</font>. </td>
            </tr>
            <tr>
                <td style="width: 50%">FixedLength </td>
                <td style="width: 50%"><font face="Verdana">以指定的长度读取数据.你可以通过 Col1, Col2 等指定列长度和类型</font>. More at <a title="Schema.ini file (Text File Driver)" href="http://msdn.microsoft.com/en-us/library/ms709353.aspx" target="_blank">MSDN</a>. </td>
            </tr>
        </tbody>
    </table>
    </li>
</ul>
</font></font><font face="Verdana">如果指定的格式是'Delimited',那么默认值是逗号(,),这个值存储在注册表里.可以修改HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text\Format来改变默认设置.<br />
不要随意修改注册表.对此MS提供了另一个可选的方法:提供我们一个<a href="http://msdn.microsoft.com/en-us/library/ms709353.aspx" target="_blank">Schema.ini</a>文件.如果我们读取一个定长的文件,我们应当使用Schema.ini文件.在Schema.ini里<font face="Verdana">指</font>定字段的长度.<br />
<font face="Verdana"><strong>读取多文件<br />
</strong></font><font face="Verdana">如果要将同列的多文件和数据合并与筛选，我们可以像在SQL里一样处理.我们可以连接表以得到合并后的数据.需要注意的是输出的数据是CROSS JOIN所有的文件的行.请确保你筛选的数据是基于相同的列.</font><br />
Example: <br />
SampleFile1.CSV &#8211; (EmpID, Name, Address) <br />
SampleFile2.CSV &#8211; (EmpID, Salary, Month) <br />
<div class="cnblogs_code" style="width: 707px; height: 173px"><span style="color: #008000">//</span><span style="color: #008000">Where&nbsp;clause&nbsp;is&nbsp;used&nbsp;to&nbsp;get&nbsp;&#8216;Natural&nbsp;Join&#8217;</span><span style="color: #008000"><br />
</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;mySelectQuery&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">SELECT&nbsp;*&nbsp;FROM&nbsp;SampleFile.CSV&nbsp;As&nbsp;Sample1,&nbsp;SampleFile2.CSV&nbsp;As&nbsp;Sample2&nbsp;</span><span style="color: #800000">"</span><span style="color: #000000">&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;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Where&nbsp;Sample1.Number=Sample2.Number</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
</span><span style="color: #800000">'</span><span style="color: #800000">Where&nbsp;clause&nbsp;is&nbsp;used&nbsp;to&nbsp;get&nbsp;&#8216;Natural&nbsp;Join&#8217;</span><span style="color: #800000"><br />
</span><span style="color: #000000">objRecordset.Open&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">SELECT&nbsp;*&nbsp;FROM&nbsp;SampleFile.CSV&nbsp;As&nbsp;Sample1,&nbsp;SampleFile2.CSV&nbsp;As&nbsp;Sample2&nbsp;</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;_&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Where&nbsp;Sample1.Number=Sample2.Number</span><span style="color: #800000">"</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;objConnection,&nbsp;adOpenStatic,&nbsp;adLockOptimistic,&nbsp;adCmdText<br />
</span></div>
</font><font face="Verdana">别名(Sample1是SampleFile.CSV的别名)在JOIN查询里是必须的,尤其是当表有相同的列名时.在本列,表名(文件名)包含有点号(.),因此查询解析器将被表名里的点号误导,以致将&#8216;CSV.Number&#8217; 当作列名.<br />
原文:<span class="ArticleTopTitle" id="ctl00_ArticleTopHeader_ArticleTitle"><a href="http://www.codeproject.com/KB/database/ReadTextFile.aspx" target="_blank"><span class="ArticleTopTitle" id="ctl00_ArticleTopHeader_ArticleTitle">Read text file (txt, csv, log, tab, fixed length)</span></a></span></font> 
<img src ="http://www.cnblogs.com/doll-net/aggbug/1226070.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42807/" target="_blank">[新闻]Mono 2.0终于到来</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>批量写数据---将XML数据批量写入数据库</title><link>http://www.cnblogs.com/doll-net/archive/2008/05/24/1206233.html</link><dc:creator>空空儿</dc:creator><author>空空儿</author><pubDate>Fri, 23 May 2008 19:05:00 GMT</pubDate><guid>http://www.cnblogs.com/doll-net/archive/2008/05/24/1206233.html</guid><wfw:comment>http://www.cnblogs.com/doll-net/comments/1206233.html</wfw:comment><comments>http://www.cnblogs.com/doll-net/archive/2008/05/24/1206233.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cnblogs.com/doll-net/comments/commentRss/1206233.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/doll-net/services/trackbacks/1206233.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 将数据批量写入数据库的需求是比较多的，方法也有很多种，在.net 里使用程序比较好的方法是<a class="postTitle2" id="AjaxHolder_ctl01_TitleUrl" href="http://www.cnblogs.com/doll-net/archive/2007/07/22/827261.html">使用 Bulk Copy 将大量数据复制到数据库</a> 。如果数据源为XML文件，使用SQL BULK COPY就需要将XML数据导入到DataTable，下面的方法可以直接将XML数据传到SQL SERVER然后处理，另外还可以直接使用T-SQL将XML文件的数据导入到数据库。<br />
这里最主要的是要使用二个系统存储过程：<font face="Verdana">SP_XML_PREPAREDOCUMENT</font> 和 <font face="Verdana">SP_XML_REMOVEDOCUMENT</font><br />
<font face="Verdana">&nbsp;&nbsp;&nbsp; SP_XML_PREPAREDOCUMENT</font> 的功能是：读取XML文件后使用 MSXML 分析器 (Msxmlsql.dll) 对XML数据进行分析，并提供分析后的文档供使用。分析后得到的数据是对 XML 文件中的各节点（元素、属性、文本和注释等）以树状形式表现。分析后的数据存储在&nbsp;SQL Server 的内部缓存中。<br />
<font face="Verdana">&nbsp;&nbsp;&nbsp; SP_XML_REMOVEDOCUMENT 的功能是：根据文档句柄释放文档所占的内存。<br />
&nbsp;&nbsp;&nbsp; 先建立一个XML字符串和一个表：<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"><font face="Verdana">&lt;?xml version="1.0"?&gt;</font><br />
&lt;ROOT</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">USER&nbsp;</span><span style="color: #ff0000">ID</span><span style="color: #0000ff">="1"</span><span style="color: #ff0000">&nbsp;Name</span><span style="color: #0000ff">="SBQCEL"</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">USER&nbsp;</span><span style="color: #ff0000">ID</span><span style="color: #0000ff">="2"</span><span style="color: #ff0000">&nbsp;Name</span><span style="color: #0000ff">="PEACELI"</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">USER&nbsp;</span><span style="color: #ff0000">ID</span><span style="color: #0000ff">="3"</span><span style="color: #ff0000">&nbsp;Name</span><span style="color: #0000ff">="SHEEPCHANG"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/ROOT</span><span style="color: #0000ff">&gt;</span></div>
&nbsp;&nbsp;&nbsp;
<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">CREATE</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TABLE</span><span style="color: #000000">&nbsp;Users<br />
(<br />
&nbsp;&nbsp;&nbsp;&nbsp;UserId&nbsp;</span><span style="color: #0000ff">INT</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;UserName&nbsp;</span><span style="color: #0000ff">VARCHAR</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">20</span><span style="color: #000000">)&nbsp;<br />
)</span></div>
</font>&nbsp;&nbsp; 处理的方法很简单：<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">DECLARE</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@HDOC</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">INT</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">文档句柄</span><span style="color: #008080"><br />
</span><span style="color: #0000ff">DECLARE</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@XMLSTRING</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">VARCHAR</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">200</span><span style="color: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">XML字符串</span><span style="color: #008080"><br />
</span><span style="color: #0000ff">SET</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@xmlString</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #ff0000">'<span style="color: #0000ff"><font style="color: #0000ff"><span style="color: red">&lt;?xml version="1.0"?&gt;<br />
</span></font></span></span><span style="color: #ff0000">&lt;ROOT&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;USER&nbsp;ID="1"&nbsp;Name="SBQCEL"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;USER&nbsp;ID="2"&nbsp;Name="PEACELI"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;USER&nbsp;ID="3"&nbsp;Name="SHEEPCHANG"/&gt;<br />
&lt;/ROOT&gt;</span><span style="color: #ff0000">'</span><span style="color: #000000"><br />
</span><span style="color: #008080">--</span><span style="color: #008080">使用系统存储过程SP_XML_PREPAREDOCUMENT分析XML字符串</span><span style="color: #008080"><br />
</span><span style="color: #0000ff">EXEC</span><span style="color: #000000">&nbsp;SP_XML_PREPAREDOCUMENT&nbsp;</span><span style="color: #008000">@HDOC</span><span style="color: #000000">&nbsp;OUTPUT,&nbsp;</span><span style="color: #008000">@XMLSTRING</span><span style="color: #000000"><br />
</span><span style="color: #008080">--</span><span style="color: #008080">使用OPENXML从SQL&nbsp;Server&nbsp;的内部缓存查询数据</span><span style="color: #008080"><br />
</span><span style="color: #0000ff">INSERT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">INTO</span><span style="color: #000000">&nbsp;Users&nbsp;</span><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;OPENXML(</span><span style="color: #008000">@HDOC</span><span style="color: #000000">,N</span><span style="color: #ff0000">'</span><span style="color: #ff0000">/ROOT/USER</span><span style="color: #ff0000">'</span><span style="color: #000000">)<br />
</span><span style="color: #0000ff">WITH</span><span style="color: #000000">&nbsp;<br />
(&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;</span><span style="color: #0000ff">INT</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;Name&nbsp;</span><span style="color: #0000ff">VARCHAR</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">10</span><span style="color: #000000">)<br />
)<br />
</span><span style="color: #008080">--</span><span style="color: #008080">使用系统存储过程SP_XML_REMOVEDOCUMENT释放内存</span><span style="color: #008080"><br />
</span><span style="color: #0000ff">EXEC</span><span style="color: #000000">&nbsp;SP_XML_REMOVEDOCUMENT&nbsp;</span><span style="color: #008000">@HDOC</span></div>
&nbsp;&nbsp; 如果要用T-SQL直接读取一个XML文件并将数据导入到表里，需要做一些额外的处理：先要用<font face="Verdana">XP_CMDSHELL将XML数据读到一个临时表（变量表），然后将每行数据组合成一个字符串，再用上面的方法处理。需要注意的是<font face="Verdana">XP_CMDSHELL以行来处理数据的。下面是一个简单的事例：</font></font><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: #008080">--</span><span style="color: #008080">定义一个变量表临时存储调用XP_CMDSHELL后得到的数据</span><span style="color: #008080"><br />
</span><span style="color: #0000ff">DECLARE</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@TEMP</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TABLE</span><span style="color: #000000"><br />
(<br />
&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;</span><span style="color: #0000ff">INT</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">IDENTITY</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">,</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;XMLSTRING&nbsp;</span><span style="color: #0000ff">VARCHAR</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">200</span><span style="color: #000000">)<br />
)<br />
</span><span style="color: #008080">--</span><span style="color: #008080">使用XP_CMDSHELL将XML文件的数据插入到变量表里</span><span style="color: #008080"><br />
</span><span style="color: #0000ff">INSERT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">INTO</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@TEMP</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">EXEC</span><span style="color: #000000">&nbsp;MASTER.DBO.XP_CMDSHELL&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">TYPE&nbsp;E:\A.XML</span><span style="color: #ff0000">'</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">DECLARE</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@LOOP</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">INT</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">循环计数</span><span style="color: #008080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">@COUNT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">INT</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">行数</span><span style="color: #008080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">@XMLSTRING</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">VARCHAR</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">200</span><span style="color: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">存储XML字符串</span><span style="color: #008080"><br />
</span><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #008000">@LOOP</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">从第1行开始</span><span style="color: #008080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">@XMLSTRING</span><span style="color: #808080">=</span><span style="color: #ff0000">''</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">初始化</span><span style="color: #008080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">@COUNT</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">COUNT</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@TEMP</span><span style="color: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">获得行数</span><span style="color: #008080"><br />
--</span><span style="color: #008080">做一个循环，将数据组合成一个字符串以便处理</span><span style="color: #008080"><br />
</span><span style="color: #0000ff">WHILE</span><span style="color: #000000">&nbsp;(</span><span style="color: #008000">@LOOP</span><span style="color: #808080">&lt;=</span><span style="color: #008000">@COUNT</span><span style="color: #000000">)<br />
</span><span style="color: #0000ff">BEGIN</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@XMLSTRING</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@XMLSTRING</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;XMLSTRING&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@TEMP</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;ID&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@LOOP</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">SET</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@LOOP</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">=</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@LOOP</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">+</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">END</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: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">@XMLSTRING</span></div>
用上面的方法处理后就将一个XML文件的数据组合成一个字符串了，然后就可以用上面的方法将数据导入到数据库了。<br />
<img src ="http://www.cnblogs.com/doll-net/aggbug/1206233.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42808/" target="_blank">[新闻]百度任命李一男担任首席技术官</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>对对象类型和调用方法属性进行存储以提升反射性能</title><link>http://www.cnblogs.com/doll-net/archive/2008/04/25/Reflection.html</link><dc:creator>空空儿</dc:creator><author>空空儿</author><pubDate>Fri, 25 Apr 2008 05:55:00 GMT</pubDate><guid>http://www.cnblogs.com/doll-net/archive/2008/04/25/Reflection.html</guid><wfw:comment>http://www.cnblogs.com/doll-net/comments/1170983.html</wfw:comment><comments>http://www.cnblogs.com/doll-net/archive/2008/04/25/Reflection.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/doll-net/comments/commentRss/1170983.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/doll-net/services/trackbacks/1170983.html</trackback:ping><description><![CDATA[反射的性能差是一个公认的事实.而最耗性能的还是根据程序集获取要调用的对象,而在对象里搜索要调用的方法所耗性能到不不是很多,如果对象里的方法不是特别的多,而去可以指定相关参数提高搜索的效率,比如<font face="Verdana">BindingFlags,Binder.<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">&nbsp;&nbsp;&nbsp; class</span><span style="color: #000000">&nbsp;Program<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;IDictionary</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;,&nbsp;Type</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;typeList&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;,&nbsp;Type</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">static</span><span style="color: #000000">&nbsp;IDictionary</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;,&nbsp;MethodInfo</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;methodList&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;,&nbsp;MethodInfo</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">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Main&nbsp;(&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">[]&nbsp;args&nbsp;)<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">int</span><span style="color: #000000">&nbsp;iBegin&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Environment.TickCount;<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;(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1000</span><span style="color: #000000">&nbsp;;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">&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;&nbsp;&nbsp;&nbsp;&nbsp;Test1(&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Test.TestClass,Test</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test1(&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Test1.Class1,Test1</span><span style="color: #800000">"</span><span style="color: #000000">&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;Console.WriteLine(&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">普通：{0}</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;,&nbsp;Environment.TickCount&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;iBegin&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;GC.Collect();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iBegin&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Environment.TickCount;<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;(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1000</span><span style="color: #000000">&nbsp;;&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;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test2(&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Test.TestClass,Test</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test2(&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Test1.Class1,Test1</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">存储Type：{0}</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;,&nbsp;Environment.TickCount&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;iBegin&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GC.Collect();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iBegin&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Environment.TickCount;<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;(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1000</span><span style="color: #000000">&nbsp;;&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;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test3(&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Test.TestClass,Test</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test3(&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Test1.Class1,Test1</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">存储MethodInfo：{0}</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;,&nbsp;Environment.TickCount&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;iBegin&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GC.Collect();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadLine();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Test1&nbsp;(&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;typeName&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;type&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Type.GetType(&nbsp;typeName&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;instance&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Activator.CreateInstance(&nbsp;type&nbsp;,&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodInfo&nbsp;methodInfo&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;type.GetMethod(&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">GetValue</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInfo.Invoke(&nbsp;instance&nbsp;,&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;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Activator.CreateInstance(&nbsp;type&nbsp;,&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;methodInfo&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;type.GetMethod(&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Add</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Type[]&nbsp;{&nbsp;</span><span style="color: #0000ff">typeof</span><span style="color: #000000">(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;)&nbsp;,&nbsp;</span><span style="color: #0000ff">typeof</span><span style="color: #000000">(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;)&nbsp;}&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInfo.Invoke(&nbsp;instance&nbsp;,&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;</span><span style="color: #800080">1</span><span style="color: #000000">&nbsp;,&nbsp;</span><span style="color: #800080">2</span><span style="color: #000000">&nbsp;}&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">存储Type</span><span style="color: #008000"><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;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Test2&nbsp;(&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;typeName&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;type&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetType(&nbsp;typeName&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;instance&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Activator.CreateInstance(&nbsp;type&nbsp;,&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodInfo&nbsp;methodInfo&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;type.GetMethod(&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">GetValue</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInfo.Invoke(&nbsp;instance&nbsp;,&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Activator.CreateInstance(&nbsp;type&nbsp;,&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;methodInfo&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;type.GetMethod(&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Add</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Type[]&nbsp;{&nbsp;</span><span style="color: #0000ff">typeof</span><span style="color: #000000">(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;)&nbsp;,&nbsp;</span><span style="color: #0000ff">typeof</span><span style="color: #000000">(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;)&nbsp;}&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInfo.Invoke(&nbsp;instance&nbsp;,&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;</span><span style="color: #800080">1</span><span style="color: #000000">&nbsp;,&nbsp;</span><span style="color: #800080">2</span><span style="color: #000000">&nbsp;}&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">存储MethodInfo</span><span style="color: #008000"><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;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Test3&nbsp;(&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;typeName&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;type&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetType(&nbsp;typeName&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;instance&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Activator.CreateInstance(&nbsp;type&nbsp;,&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodInfo&nbsp;methodInfo&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetMethod(&nbsp;typeName&nbsp;,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">GetValue</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;,&nbsp;type&nbsp;,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Type[</span><span style="color: #800080">0</span><span style="color: #000000">]&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInfo.Invoke(&nbsp;instance&nbsp;,&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Activator.CreateInstance(&nbsp;type&nbsp;,&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;methodInfo&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetMethod(&nbsp;typeName&nbsp;,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Add</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;,&nbsp;type&nbsp;,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Type[]&nbsp;{&nbsp;</span><span style="color: #0000ff">typeof</span><span style="color: #000000">(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;)&nbsp;,&nbsp;</span><span style="color: #0000ff">typeof</span><span style="color: #000000">(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;)&nbsp;}&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInfo.Invoke(&nbsp;instance&nbsp;,&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;</span><span style="color: #800080">1</span><span style="color: #000000">&nbsp;,&nbsp;</span><span style="color: #800080">2</span><span style="color: #000000">&nbsp;}&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Type&nbsp;GetType&nbsp;(&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;typeName&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;type&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;(&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">typeList.ContainsKey(&nbsp;typeName&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;&nbsp;&nbsp;&nbsp;&nbsp;type&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Type.GetType(&nbsp;typeName&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typeList.Add(&nbsp;typeName&nbsp;,&nbsp;type&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">else</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;typeList[typeName];<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;type;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;MethodInfo&nbsp;GetMethod&nbsp;(&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;typeName&nbsp;,&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;methodName&nbsp;,&nbsp;Type&nbsp;type&nbsp;,&nbsp;</span><span style="color: #0000ff">params</span><span style="color: #000000">&nbsp;Type[]&nbsp;types&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodInfo&nbsp;methodInfo&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;(&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">methodList.ContainsKey(&nbsp;typeName&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;methodName&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;&nbsp;&nbsp;&nbsp;&nbsp;methodInfo&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;type.GetMethod(&nbsp;methodName&nbsp;,&nbsp;types&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodList.Add(&nbsp;typeName&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;methodName&nbsp;,&nbsp;methodInfo&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">else</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodInfo&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;methodList[typeName&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;methodName];<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;methodInfo;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
</font>其中 <font face="Verdana">Test</font>.<font face="Verdana">TestClass</font> 类和 <font face="Verdana">Test1</font>.<font face="Verdana">Class1</font> 都有一个无参构造函数和一个int类型的参数及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: #0000ff">int</span><span style="color: #000000">&nbsp;val&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Class1&nbsp;(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;val&nbsp;)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.val&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;val;<br />
}<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;GetValue&nbsp;()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">.Format(&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">the&nbsp;value&nbsp;is&nbsp;{0}</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;,&nbsp;val&nbsp;);<br />
}<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Add&nbsp;(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a&nbsp;,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b&nbsp;)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;a&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;b;<br />
}</span></div>
为了测试,上面2个类里都加了几个方法(只是定义,并没有具体的实现代码).<br />
测试了下不进行任何处理,时间都在130左右波动,对Type进行存储,时间在32左右,基本上没什么波幅,而对Type和MethodInfo进行存储时间维持在31.<br />
看来这样处理下对性能的改善还是起到了作用.
 <img src ="http://www.cnblogs.com/doll-net/aggbug/1170983.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42805/" target="_blank">[新闻]Google Knol 开始尝试有声版</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>过程 sp_addlinkedsrvlogin，第 91 行解密过程中出错的解决办法</title><link>http://www.cnblogs.com/doll-net/archive/2008/03/27/1126089.html</link><dc:creator>空空儿</dc:creator><author>空空儿</author><pubDate>Thu, 27 Mar 2008 13:43:00 GMT</pubDate><guid>http://www.cnblogs.com/doll-net/archive/2008/03/27/1126089.html</guid><wfw:comment>http://www.cnblogs.com/doll-net/comments/1126089.html</wfw:comment><comments>http://www.cnblogs.com/doll-net/archive/2008/03/27/1126089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/doll-net/comments/commentRss/1126089.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/doll-net/services/trackbacks/1126089.html</trackback:ping><description><![CDATA[今天用连接服务器实现分布式查询时注册了连接服务器后，在创建服务器间的远程登录映射时报错，错误消息如下：<br />
<span style="color: red">消息 15466，级别 16，状态 2，过程 sp_addlinkedsrvlogin，第 91 行<br />
解密过程中出错。<br />
消息 15185，级别 16，状态 1，过程 sp_addlinkedsrvlogin，第 98 行<br />
没有从远程服务器 'XXXXXX' 映射到本地用户 '(null)' 的远程用户 'XXXXXXX'。<br />
<font color="#000000">开始还以为是语句写错了，看了下联机帮助，语句写得没问题</font></span>,折腾了一番终于找到解决办法:<br />
在本地服务器上执行: <font style="color: #ff0000" face="Verdana">ALTER SERVICE MASTER KEY FORCE REGENERATE.<br />
<span style="color: #000000">这个语句的功能是重新生成本地服务器的<font style="color: #000000" face="Verdana" color="#ff0000">主密钥。</font></span></font>
<img src ="http://www.cnblogs.com/doll-net/aggbug/1126089.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42804/" target="_blank">[新闻]12日电脑与人进行世纪对话 可思考机器或诞生</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>生成大量随机字符串不同实现方式的效率对比</title><link>http://www.cnblogs.com/doll-net/archive/2008/03/08/Random.html</link><dc:creator>空空儿</dc:creator><author>空空儿</author><pubDate>Fri, 07 Mar 2008 16:31:00 GMT</pubDate><guid>http://www.cnblogs.com/doll-net/archive/2008/03/08/Random.html</guid><wfw:comment>http://www.cnblogs.com/doll-net/comments/1096001.html</wfw:comment><comments>http://www.cnblogs.com/doll-net/archive/2008/03/08/Random.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cnblogs.com/doll-net/comments/commentRss/1096001.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/doll-net/services/trackbacks/1096001.html</trackback:ping><description><![CDATA[<p>在26位英文字母中随即选取10个字符组成字符串，产生一定数量的唯一字符串，对比几种方式：<br />
1.使用 <font face="Verdana">System.Security.Cryptography.RNGCryptoServiceProvider</font> 生成 Random 的种子 和 使用普通声称随机数进行对比.<br />
2.使用 <font face="Verdana">IDictionary&lt;TKey , TValue&gt; 其中TKey是 Int 型 存放字符串的HashCode,TValue 是 String 型,存放生成的字符串,通过对比键判断是否项是否已经存在 和 使用 IList&lt;T&gt; 存储字符串进行对比.<br />
3.使用随机截取字符串 和 随机字符串数组索引获取组成字符串.<br />
</p>
生成构建 Random&nbsp;实例种子的方法:<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">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;GetRandomSeed(&nbsp;)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;bytes&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[</span><span style="color: #800080">4</span><span style="color: #000000">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Security.Cryptography.RNGCryptoServiceProvider&nbsp;rng&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;System.Security.Cryptography.RNGCryptoServiceProvider(&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rng.GetBytes(&nbsp;bytes&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;BitConverter.ToInt32(&nbsp;bytes&nbsp;,&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;);<br />
}</span></div>
</font>生成随机字符串的方法:<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">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;GetRandomString(&nbsp;)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;sbPwd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringBuilder(&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Random&nbsp;random&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Random(&nbsp;GetRandomSeed(&nbsp;)&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;length&nbsp;;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbPwd.Append(&nbsp;strSource.Substring(&nbsp;random.Next(&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;,&nbsp;</span><span style="color: #800080">25</span><span style="color: #000000">&nbsp;)&nbsp;,&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">&nbsp;)&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">sbPwd.Append(&nbsp;sourceArray[random.Next(&nbsp;0&nbsp;,&nbsp;25&nbsp;)]&nbsp;);</span><span style="color: #008000"><br />
</span><span style="color: #000000">&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;sbPwd.ToString(&nbsp;);<br />
}</span></div>
<br />
对比结果:<br />
<font face="Verdana">
<p><font face="Verdana">1.使用 GetRandomSeed( )方法生成 Random 种子 并使用字符截取 使用IDictionary&lt;int , string&gt; 耗时 20688MS&nbsp; 产生重复项 359&nbsp; 生成项:1000000<br />
2.不使用 GetRandomSeed( )方法生成 Random 种子 并使用字符截取 使用IDictionary&lt;int , string&gt;&nbsp; 耗时 1562547MS&nbsp; 产生重复项 127749442&nbsp; 生成项:100000<br />
3.使用 GetRandomSeed( )方法生成 Random 种子 并使用字符串数组 使用IDictionary&lt;int , string&gt;&nbsp; 耗时36125MS&nbsp; 产生重复项 381&nbsp;&nbsp; 生成项:1000000(使用Char数组效率更低,随机取得Char转换成String时要进行装箱)<br />
4.使用GetRandomSeed( )方法生成 Random 种子 并使用字符截取 使用IList&lt;string&gt; 耗时 214719MS&nbsp; 产生重复项2 生成项:100000(生成项越多耗时越长)</font></p>
<p><font face="Verdana">可见使用 System.Security.Cryptography.RNGCryptoServiceProvider 生成 Random 种子 产生的效率要高很多,特别是要连续生成大量的随机数，因为 Random 生成值的重复率非常低.<br />
使用字符串的HashCode对比字符串比直接对比字符串效率要高很多.<br />
使用字符串截取比使用字符串数组效率要高点.</font></p>
</font>
 <img src ="http://www.cnblogs.com/doll-net/aggbug/1096001.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42803/" target="_blank">[新闻]人民网评:中国移动为什么要抛弃iPhone?</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>用SQL SERVER 2005新提供的命令实现行列转换</title><link>http://www.cnblogs.com/doll-net/archive/2008/02/02/CTE_PIVOT.html</link><dc:creator>空空儿</dc:creator><author>空空儿</author><pubDate>Sat, 02 Feb 2008 02:48:00 GMT</pubDate><guid>http://www.cnblogs.com/doll-net/archive/2008/02/02/CTE_PIVOT.html</guid><wfw:comment>http://www.cnblogs.com/doll-net/comments/1062230.html</wfw:comment><comments>http://www.cnblogs.com/doll-net/archive/2008/02/02/CTE_PIVOT.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cnblogs.com/doll-net/comments/commentRss/1062230.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/doll-net/services/trackbacks/1062230.html</trackback:ping><description><![CDATA[昨天一朋友问我一个问题，需要将一张表里指定的编号(2-4个)，按照名称统计编号的数量，仅有一个编号数据的不显示。<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">CREATE</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TABLE</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TEMP</span><span style="color: #000000"><br />
(<br />
&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">INT</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">IDENTITY</span><span style="color: #000000">(</span><span style="font-weight: bold; color: #800000">1</span