<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_停留的风</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/26349/rss</id><updated>2012-02-08T02:30:57Z</updated><author><name>停留的风</name><uri>http://www.cnblogs.com/yank/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yank/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/26349/rss"/><entry><id>http://www.cnblogs.com/yank/archive/2011/10/24/2204145.html</id><title type="text">net中String是引用类型还是值类型</title><summary type="text">关于String为值类型还是引用类型的讨论一直没有平息，最近一直在研究性能方面的问题，今天再次将此问题进行一次明确。希望能给大家带来点帮助。 如果有错误请指出。结论：String是引用类型，只是编译器对其做了特殊处理，使其具有了恒定不变性。string最为显著的一个特点就是它具有恒定不变性：我们一旦创建了一个string，在managed heap 上为他分配了一块连续的内存空间，我们将不能以任何方式对这个string进行修改使之变长、变短、改变格式。所有对这个string进行各项操作（比如调用ToUpper获得大写格式的string）而返回的string，实际上另一个重新创建的string，其本身并不会产生任何变化。</summary><published>2011-10-24T06:03:00Z</published><updated>2011-10-24T06:03:00Z</updated><author><name>停留的风</name><uri>http://www.cnblogs.com/yank/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yank/archive/2011/10/24/2204145.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yank/archive/2011/10/24/2204145.html"/><content type="html">&lt;p&gt;关于String为值类型还是引用类型的讨论一直没有平息，最近一直在研究性能方面的问题，今天再次将此问题进行一次明确。希望能给大家带来点帮助。 如果有错误请指出。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;来看下面例子：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;值类型&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; b = a;&lt;br /&gt;            a = &lt;span style="color: #800080;"&gt;2&lt;/span&gt;;&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;a is {0},b is {1}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, a, b);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;字符串&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; str1 = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ab&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; str2 = str1;&lt;br /&gt;            str1 = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;abc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;str1 is {0},str2 is {1}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, str1, str2);&lt;br /&gt;            Console.Read();&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;根据上面的例子：你觉得输出结果应该是什么？&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;输出结果：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;结果：&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;a is 2,b is 1&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;str1 is abc,str2 is ab&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;str2依然是ab,并没有随str1的改变而改变。&lt;/p&gt;&#xD;
&lt;p&gt;如果string是引用类型，按理Str1和Str指针都指向同一内存地址，如果Str的内容发生改变，Str1应该也会相应变化。&lt;/p&gt;&#xD;
&lt;p&gt;此例子，看着string更像是值类型。&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;但是MSDN却说String是引用类型，&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;引用类型包括：&lt;/strong&gt;&amp;nbsp;&lt;br /&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;String&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;所有数组，即使其元素是值类型&lt;/p&gt;&#xD;
&lt;p&gt;类类型，如 Form&lt;/p&gt;&#xD;
&lt;p&gt;委托&lt;/p&gt;&#xD;
&lt;p&gt;可参考：&lt;a href="http://msdn.microsoft.com/zh-cn/library/t63sy5hs(VS.80).aspx"&gt;http://msdn.microsoft.com/zh-cn/library/t63sy5hs(VS.80).aspx&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;查看具体引用是否相同&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果Net能够查看内存地址就容易了，但不允许，只能通过间接方法来实现，看下面：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; TestRefAddress()&lt;br /&gt;        {&lt;br /&gt;            String str1 = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;abc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;            String str2 = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;abc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; b = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;            StringBuilder strb1 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; StringBuilder(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;abc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            StringBuilder strb2 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; StringBuilder(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;abc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Reference equal for string: &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + Object.ReferenceEquals(str1, str2)); &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;结果true&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Reference equal for int: &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + Object.ReferenceEquals(a, b)); &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;结果false&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Reference equal for StringBuilder: &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + Object.ReferenceEquals(strb1, strb2)); &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;结果false&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Value equal for string: &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + str1.Equals(str2)); &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;结果true，类似于值类型&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            Console.Read();&lt;br /&gt;        }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;结果为何出现如此情况，分析如下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Reference equal for string: &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + Object.ReferenceEquals(str1, str2)); &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;结果true，不同对象，但引用地址相同&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Reference equal for int: &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + Object.ReferenceEquals(a, b)); &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;结果false,值类型装箱操作造成&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Reference equal for StringBuilder: &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + Object.ReferenceEquals(strb1, strb2)); &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;结果false，不同对象，引用地址不同&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;    Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Value equal for string: &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + str1.Equals(str2)); &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;结果true，类似于值类型&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;由第一条结果，可以判定不同的String的，相同的值，其引用地址相同，再由第四条结果，str1.Equals(str2),两者结合，可得出结论，两个String，如果赋值为同一个值，在内存中只有一个字符串存在，两个引用的地址相同。由此引出String的不变性。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;String的不变性&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;string最为显著的一个特点就是它具有恒定不变性：我们一旦创建了一个string，在managed heap 上为他分配了一块连续的内存空间，我们将不能以任何方式对这个string进行修改使之变长、变短、改变格式。所有对这个string进行各项操作（比如调用ToUpper获得大写格式的string）而返回的string，实际上另一个重新创建的string，其本身并不会产生任何变化。 &lt;br /&gt;string&amp;nbsp;&amp;nbsp; 对象称为不可变的（只读），因为一旦创建了该对象，就不能修改该对象的值。有的时候看来似乎修改了，实际是string经过了特殊处理，每次改变值时都会建立一个新的string对象，变量会指向这个新的对象，而原来的还是指向原来的对象，所以不会改变。这也是string效率低下的原因。&lt;/p&gt;&#xD;
&lt;p&gt;String的不变，并非说string不能改变，而是其值不能改变。&lt;/p&gt;&#xD;
&lt;p&gt;在例子中str1="ab",这时在内存中就将&amp;ldquo;ab&amp;rdquo;存下来，如果再创建字符串对象，其值也等于&amp;ldquo;ab&amp;rdquo;，str2="ab",则并非再重新分配内存空间，而是将之前保存的&amp;ldquo;ab&amp;rdquo;的地址赋给str2的引用，这就能印证例子2中的结果。而当str1="abc"其值发生改变时，这时检查内存，发现不存在此字符串，则重新分配内存空间，存储&amp;ldquo;abc&amp;rdquo;，并将其地址赋给str1，而str2依然指向&amp;ldquo;ab&amp;rdquo;的地址。可以印证例子1中的结果。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;结论：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;String是引用类型，只是编译器对其做了特殊处理。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;关于讨论：&lt;a href="http://social.msdn.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/ce580186-86d9-45f7-b5ff-20302caf1324"&gt;http://social.msdn.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/ce580186-86d9-45f7-b5ff-20302caf1324&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yank/aggbug/2204145.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yank/archive/2011/10/24/2204145.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yank/archive/2011/10/09/GenericInfo.html</id><title type="text">泛型（1）：泛型介绍</title><summary type="text">泛型（1）：泛型介绍简要介绍泛型的基本概念，基本用法和优势</summary><published>2011-10-09T07:24:00Z</published><updated>2011-10-09T07:24:00Z</updated><author><name>停留的风</name><uri>http://www.cnblogs.com/yank/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yank/archive/2011/10/09/GenericInfo.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yank/archive/2011/10/09/GenericInfo.html"/><content type="html">&lt;h2 id="E3AA"&gt;泛型&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;什么是泛型&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;通过泛型可以定义类型安全类，而不会损害类型安全、性能或工作效率。您只须一次性地将服务器实现为一般服务器，同时可以用任何类型来声明和使用它。为此，需要使用 &lt;b&gt;&amp;lt;&lt;/b&gt; 和 &lt;b&gt;&amp;gt;&lt;/b&gt; 括号，以便将一般类型参数括起来。&lt;/p&gt;&#xD;
&lt;p&gt;List&amp;lt;String&amp;gt; strList = new List&amp;lt;String&amp;gt;():&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;泛型介绍&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;泛型类和泛型方法同时具备可重用性、类型安全和效率，这是非泛型类和非泛型方法无法具备的。泛型通常用在集合和在集合上运行的方法中。.NET Framework 2.0 版类库提供一个新的命名空间 System.Collections.Generic，其中包含几个新的基于泛型的集合类。建议面向 2.0 版的所有应用程序都使用新的泛型集合类，而不要使用旧的非泛型集合类，如 ArrayList。&lt;br /&gt;&lt;br /&gt;当然，也可以创建自定义泛型类型和方法，以提供自己的通用解决方案，设计类型安全的高效模式。下面的代码示例演示一个用于演示用途的简单泛型链接列表类。（大多数情况下，建议使用 .NET Framework 类库提供的 List&amp;lt;T&amp;gt; 类，而不要自行创建类。）在通常使用具体类型来指示列表中所存储项的类型时，可使用类型参数 T。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;泛型例子&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Declare the generic class.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; GenericList&amp;lt;T&amp;gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Add(T input) { }&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; TestGenericList&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; ExampleClass { }&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Main()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Declare a list of type int.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        GenericList&amp;lt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&amp;gt; list1 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; GenericList&amp;lt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&amp;gt;();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Declare a list of type string.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        GenericList&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt; list2 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; GenericList&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt;();&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Declare a list of type ExampleClass.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;        GenericList&amp;lt;ExampleClass&amp;gt; list3 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; GenericList&amp;lt;ExampleClass&amp;gt;();&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;泛型优点&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn4_0221d77921ad97074425155699eeed29" &gt;使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn5_4068dcfc15f4422131fb4a33bf4d256b" &gt;泛型最常见的用途是创建集合类。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn6_db5d6a8f46dda094856b90350eae7bda" &gt;.NET Framework 类库在 &lt;span&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.collections.generic.aspx"&gt;System.Collections.Generic&lt;/a&gt;&lt;/span&gt; 命名空间中包含几个新的泛型集合类。&lt;/span&gt; &lt;span id="xn7_7820c419a25c109dbe3c807b4757a72c" &gt;应尽可能地使用这些类来代替普通的类，如 &lt;span&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.collections.aspx"&gt;System.Collections&lt;/a&gt;&lt;/span&gt; 命名空间中的 &lt;span&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/system.collections.arraylist.aspx"&gt;ArrayList&lt;/a&gt;&lt;/span&gt;。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn8_f02364ea4cd006cf4d460d5418c241ce" &gt;您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn9_3e04bb68783c9e1a26b53e4c8e18ceac" &gt;可以对泛型类进行约束以访问特定数据类型的方法。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&#xD;
&lt;p&gt;&lt;span id="xn10_5a2af9d930e32a28157149a9d98fd59d" &gt;关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&lt;img src="http://www.cnblogs.com/yank/aggbug/2203750.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yank/archive/2011/10/09/GenericInfo.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yank/archive/2011/10/08/2201822.html</id><title type="text">如果是除去末尾特定字符或字符串：TrimEnd方法性能优于Remove方法</title><summary type="text">测试用例--除去末尾特定字符或字符串，Remove方法和TrimEnd方法的比较结论：如果是除去末尾特定字符或字符串：TrimEnd方法性能优于Remove方法</summary><published>2011-10-08T03:04:00Z</published><updated>2011-10-08T03:04:00Z</updated><author><name>停留的风</name><uri>http://www.cnblogs.com/yank/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yank/archive/2011/10/08/2201822.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yank/archive/2011/10/08/2201822.html"/><content type="html">&lt;p&gt;测试用例--除去末尾特定字符或字符串，Remove方法和TrimEnd方法的比较&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;结论：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;如果是除去末尾特定字符或字符串：TrimEnd方法性能优于Remove方法&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;具体测试用例如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;Stopwatch watcher = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Stopwatch();&lt;br /&gt;&lt;br /&gt;            watcher.Reset();&lt;br /&gt;            watcher.Start();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count = &lt;span style="color: #800080;"&gt;1000000&lt;/span&gt;;&lt;br /&gt;            List&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt; strList = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;gt;();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; count; i++)&lt;br /&gt;            {&lt;br /&gt;                strList.Add(i.ToString());&lt;br /&gt;            }&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;           &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; 测试用例--除去末尾特定字符或字符串，Remove方法和TrimEnd方法的比较&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; result;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; Remove方法&lt;br /&gt;            watcher.Reset();&lt;br /&gt;            watcher.Start();&lt;br /&gt;            StringBuilder builder = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; StringBuilder();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; item &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; strList)&lt;br /&gt;            {&lt;br /&gt;                builder.Append(item);&lt;br /&gt;                builder.Append(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);&lt;br /&gt;            }&lt;br /&gt;            result = builder.Remove(builder.Length - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1&lt;/span&gt;).ToString();&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;StringBuilder.Remove:{0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, watcher.ElapsedMilliseconds);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; TrimEnd方法&lt;br /&gt;            watcher.Reset();&lt;br /&gt;            watcher.Start();&lt;br /&gt;            result = builder.ToString().TrimEnd(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;);&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;StringBuilder.TrimEnd:{0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, watcher.ElapsedMilliseconds);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;************************************************&lt;br /&gt;             * 测试用例：除去末尾特定字符或字符串，Remove方法和TrimEnd方法的比较&lt;br /&gt;             * 结论：如果是除去末尾特定字符或字符串：TrimEnd方法性能优于Remove方法&lt;br /&gt;             * 测试结果如下：(时间为毫秒)&lt;br /&gt;             * --------------------------------------&lt;br /&gt;             * 数据：   | 10W    | 100W  |  1000W&lt;br /&gt;             * --------------------------------------&lt;br /&gt;             * Remove   |  7    |   81   |   786&lt;br /&gt;             * ---------------------------------------&lt;br /&gt;             * TrimEnd  |  0    |   12   |   108  &lt;br /&gt;             *&lt;br /&gt;             &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt; &lt;/pre&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/yank/aggbug/2201822.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yank/archive/2011/10/08/2201822.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yank/archive/2011/09/30/DictionaryToList.html</id><title type="text">Dictionary到List转换中的性能问题</title><summary type="text">在应用泛型中，我们经常使用Dictionary，经常会用到Dictionary到List的转换。经过各位高人指点后，做出适当调整，以免误人子弟，特此对关注此帖的同仁深表感谢。希望能继续提醒、斧正。Dictionary转换为List通常方法，可以有五种：1、创建List的时候，将Dictionary的Value值作为参数2、创建List后，调用List.AddRange方法3、建立List，循环Dictionary逐个赋值4、通过Linq查询，得到结果后调用ToList方法5、用Dictionary对象自带的ToList方法但是五种方法如何取舍呢？性能方面哪种更好一点呢？</summary><published>2011-09-30T08:45:00Z</published><updated>2011-09-30T08:45:00Z</updated><author><name>停留的风</name><uri>http://www.cnblogs.com/yank/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yank/archive/2011/09/30/DictionaryToList.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yank/archive/2011/09/30/DictionaryToList.html"/><content type="html">&lt;p&gt;在应用泛型中，我们经常使用Dictionary，经常会用到Dictionary到List的转换。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #800000;"&gt;经过各位高人指点后，做出适当调整，以免误人子弟，特此对关注此帖的同仁深表感谢。希望能继续提醒、斧正。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Dictionary转换为List通常方法，可以有五种：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1、创建List的时候，将Dictionary的Value值作为参数&lt;/p&gt;&#xD;
&lt;p&gt;2、创建List后，调用List.AddRange方法&lt;/p&gt;&#xD;
&lt;p&gt;3、建立List，循环Dictionary逐个赋值&lt;/p&gt;&#xD;
&lt;p&gt;4、通过Linq查询，得到结果后调用ToList方法&lt;/p&gt;&#xD;
&lt;p&gt;5、用Dictionary对象自带的ToList方法&lt;/p&gt;&#xD;
&lt;p&gt;但是五种方法如何取舍呢？性能方面哪种更好一点呢？&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;针对此疑问，特做了测试验证。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;测试结果如下：（经过多次测试，取平均值）&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;测试结果（时间为毫秒）        &lt;br /&gt;             * * =============================================      &lt;br /&gt;             * * 数据       |  10W   |   100W  | 1000W          &lt;br /&gt;             * * --------------------------------------------- &lt;br /&gt;             * * 创建集合   |   2    |   28    | 280&lt;br /&gt;             * * ---------------------------------------------&lt;br /&gt;             * * AddRange   |  19    |   33    | 362&lt;br /&gt;             * * ---------------------------------------------&lt;br /&gt;             * * 循环赋值   |   7    |   60    | 869          &lt;br /&gt;             * * ---------------------------------------------            &lt;br /&gt;             * * Linq查询   |   8    |   7     | 238   此没有相关性，只是作为下面ToList方法的参考 &lt;br /&gt;             * * ---------------------------------------------&lt;br /&gt;             * * Linq查询 &lt;br /&gt;             * * 后ToList   |  11    |   97    | 1627&lt;br /&gt;             * * ---------------------------------------------     &lt;br /&gt;             * * ToList方法 |   5    |   23    |  948         &lt;br /&gt;             * *           &lt;br /&gt;             * &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;通过上述结果，可以得出结论：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;结论1：&lt;/strong&gt;方法1和方法2性能较好，可优先考虑方法1&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;结论2：&lt;/strong&gt;TOList方法性能方面稍差，方法4和方法5不可取。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;具体测试用例代码如下&lt;/strong&gt;，如有纰漏，请指出：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Diagnostics;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; ToListTest&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Program&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;        {&lt;br /&gt;            TestToList();&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 测试代码&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; TestToList()&lt;br /&gt;        {&lt;br /&gt;            Dictionary&amp;lt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;, Person&amp;gt; dic = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;, Person&amp;gt;();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; 填充数据&lt;br /&gt;            Person p;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;100000&lt;/span&gt;; i++)&lt;br /&gt;            {&lt;br /&gt;                p = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Person(i, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;P_&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + i.ToString());&lt;br /&gt;                dic.Add(i, p);&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            List&amp;lt;Person&amp;gt; pList;&lt;br /&gt;            Stopwatch watcher = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Stopwatch();&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; 创建集合对象时，将集合作为参数&lt;br /&gt;            watcher.Reset();&lt;br /&gt;            watcher.Start();&lt;br /&gt;&lt;br /&gt;            pList = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Person&amp;gt;(dic.Values);&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;new List&amp;lt;&amp;gt;\t{0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, watcher.ElapsedMilliseconds);&lt;br /&gt;            watcher.Stop();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; 调用方法AddRange&lt;br /&gt;&lt;br /&gt;            pList = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Person&amp;gt;();&lt;br /&gt;            watcher.Reset();&lt;br /&gt;            watcher.Start();&lt;br /&gt;&lt;br /&gt;            pList.AddRange(dic.Values);&lt;br /&gt;&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;测试AddRange\t{0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, watcher.ElapsedMilliseconds);&lt;br /&gt;            watcher.Stop();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; 测试循环赋值&lt;br /&gt;            pList = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Person&amp;gt;();&lt;br /&gt;            watcher.Reset();&lt;br /&gt;            watcher.Start();&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (var item &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; dic)&lt;br /&gt;            {&lt;br /&gt;                pList.Add(item.Value);&lt;br /&gt;            }&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;测试循环赋值\t{0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, watcher.ElapsedMilliseconds);&lt;br /&gt;            watcher.Stop();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; 测试Linq&lt;br /&gt;&lt;br /&gt;            watcher.Reset();&lt;br /&gt;            watcher.Start();&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;var list = from temp in dic&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;           select temp.Value;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;pList = list as List&amp;lt;Person&amp;gt;; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;pList 确实为Null，这样操作错误&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;原因：&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;得到的list为：{System.Linq.Enumerable.WhereSelectEnumerableIterator&amp;lt;KeyValuePair&amp;lt;int,Person&amp;gt;,Person&amp;gt;}&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;            IEnumerable&amp;lt;Person&amp;gt; list = from temp &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; dic&lt;br /&gt;                                       select temp.Value;&lt;br /&gt;&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;测试Linq\t{0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, watcher.ElapsedMilliseconds);&lt;br /&gt;            watcher.Stop();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; 测试Linq 需要ToList()&lt;br /&gt;&lt;br /&gt;            watcher.Reset();&lt;br /&gt;            watcher.Start();&lt;br /&gt;            pList = (from temp &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; dic&lt;br /&gt;                     select temp.Value).ToList();&lt;br /&gt;&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;测试Linq,需要ToList\t{0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, watcher.ElapsedMilliseconds);&lt;br /&gt;            watcher.Stop();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; 测试ToList&lt;br /&gt;            watcher.Reset();&lt;br /&gt;            watcher.Start();&lt;br /&gt;            pList = dic.Values.ToList&amp;lt;Person&amp;gt;();&lt;br /&gt;            Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;测试ToList\t{0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, watcher.ElapsedMilliseconds);&lt;br /&gt;            watcher.Stop();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;测试结果（时间为毫秒）        &lt;br /&gt;             * * =============================================      &lt;br /&gt;             * * 数据       |  10W   |   100W  | 1000W          &lt;br /&gt;             * * --------------------------------------------- &lt;br /&gt;             * * 创建集合   |   2    |   28    | 280&lt;br /&gt;             * * ---------------------------------------------&lt;br /&gt;             * * AddRange   |  19    |   33    | 362&lt;br /&gt;             * * ---------------------------------------------&lt;br /&gt;             * * 循环赋值   |   7    |   60    | 869          &lt;br /&gt;             * * ---------------------------------------------            &lt;br /&gt;             * * Linq查询   |   8    |   7     | 238   此没有相关性，只是作为下面ToList方法的参考 &lt;br /&gt;             * * ---------------------------------------------&lt;br /&gt;             * * Linq查询 &lt;br /&gt;             * * 后ToList   |  11    |   97    | 1627&lt;br /&gt;             * * ---------------------------------------------     &lt;br /&gt;             * * ToList方法 |   5    |   23    |  948         &lt;br /&gt;             * *           &lt;br /&gt;             * &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Person&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; id;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; ID&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; id; }&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt; { id = value; }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; name;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Name&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; name; }&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt; { name = value; }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; Person(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; id, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; name)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.id = id;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.name = name;&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yank/aggbug/2196681.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yank/archive/2011/09/30/DictionaryToList.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yank/archive/2011/09/22/2185273.html</id><title type="text">可空枚举的处理方法</title><summary type="text">可空枚举在使用枚举的时候的，经常希望可以对枚举赋值为Null,或者清空枚举值。但是常用的枚举，就是固定的几项。而且不能对值类型赋值为Null。如何来实现可空枚举？要求保留到数据库中的值，需要为NULL。这种情况在业务开发中经常出现。尽管问题较小，但是可以探讨下解决方案，找到一种最优解。</summary><published>2011-09-22T08:58:00Z</published><updated>2011-09-22T08:58:00Z</updated><author><name>停留的风</name><uri>http://www.cnblogs.com/yank/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yank/archive/2011/09/22/2185273.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yank/archive/2011/09/22/2185273.html"/><content type="html">&lt;p&gt;&lt;strong&gt;可空枚举&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在使用枚举的时候的，经常希望可以对枚举赋值为Null,或者清空枚举值。但是常用的枚举，就是固定的几项。而且不能对值类型赋值为Null。如何来实现可空枚举？&lt;/p&gt;&#xD;
&lt;p&gt;要求保留到数据库中的值，需要为NULL。这种情况在业务开发中经常出现。&lt;/p&gt;&#xD;
&lt;p&gt;尽管问题较小，但是可以探讨下解决方案，找到一种最优解。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;方法1：&lt;/strong&gt;将存储值定义可空类型&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 单据状态，记录枚举值&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;? State { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;可行，如果为空，则数据库存储的值也为Null.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;缺点：&lt;/strong&gt;不方便我们对枚举进行展现和赋值，通常直接使用枚举，参见方法2。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;方法2：&lt;/strong&gt;定义枚举字段，并将其定义为可空类型&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 状态&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; RecordState? State { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这种方法较上面的方法较好，同样能够实现此功能。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;缺点：&lt;/strong&gt;通常枚举值的展现是展现枚举的所有项，一般使用下拉框，必须选中一项。这样无法实现可空情况。如果要实现所需功能，需要在显示时，做下处理，加入空项。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;方法3：&lt;/strong&gt;在枚举中定义空项，并在写入数据库，或取值时进行的相关的转换&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3.1 定义枚举：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 记录状态&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;enum&lt;/span&gt; RecordState&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 空&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        None,&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 新增&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        New,&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 修改&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        Modified,&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 删除&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        Deleted&lt;br /&gt;    }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3.2 使用枚举：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 单据&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Doc&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 单据&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; DocNo { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 单据状态&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; RecordState State { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 构造函数&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; Doc()&lt;br /&gt;        { &lt;br /&gt;            &lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面是数据时需要特别注意的：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;写入数据库时，&lt;/strong&gt;处理情况，参数赋值情况，这样其数据库的值才为NULL,&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;SqlParameter param = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; SqlParameter(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;State&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,SqlDbType.SmallInt);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (doc.State == RecordState.None)&lt;br /&gt;            {&lt;br /&gt;                param.Value = DBNull.Value;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                param.Value = doc.State;&lt;br /&gt;            }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;加载对象时：&lt;/strong&gt;加载出来又是枚举项&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;SqlDataReader reader&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            Doc doc = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Doc();           &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (reader[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;State&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;] == DBNull.Value)&lt;br /&gt;            {&lt;br /&gt;                doc.State = RecordState.None;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                doc.State =(RecordState)reader.GetInt16(reader.GetOrdinal(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;State&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;));&lt;br /&gt;            }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yank/aggbug/2185273.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yank/archive/2011/09/22/2185273.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yank/archive/2011/09/17/PropertyGrid_Enum.html</id><title type="text">PropertyGrid中的枚举显示为中文</title><summary type="text">PropertyGrid中的枚举显示为中文在系统开发中，经常会使用PropertyGrid来修改或者展示某个对象的属性，如果类中定义了枚举，在展现的时候默认会展示枚举的项或者枚举值，但是这并不是我们想要的。用户使用的时候并不清楚该项代表的意思。这就需要我们来对显示进行明确。如何使得PropertyGrid的枚举显示中文呢？本文给了一种简单而且又很强大的方法。</summary><published>2011-09-17T06:01:00Z</published><updated>2011-09-17T06:01:00Z</updated><author><name>停留的风</name><uri>http://www.cnblogs.com/yank/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yank/archive/2011/09/17/PropertyGrid_Enum.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yank/archive/2011/09/17/PropertyGrid_Enum.html"/><content type="html">&lt;p&gt;&lt;strong&gt;PropertyGrid中的枚举显示为中文&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在系统开发中，经常会使用PropertyGrid来修改或者展示某个对象的属性，如果类中定义了枚举，在展现的时候默认会展示枚举的项或者枚举值，但是这并不是我们想要的。用户使用的时候并不清楚该项代表的意思。之前介绍过枚举显示中文的一篇文章，大家可以看下，&lt;a href="http://www.cnblogs.com/yank/archive/2011/09/08/EnumDisplayInChinese.html"&gt;枚举显示中文&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;想要的效果：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22790/2011091713562988.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在PropertyGrid中枚举显示中，又比较复杂一些。PropertyGrid显示复杂属性需要TypeConverter，也就是一个转换器，可以对其进行设置，显示我们想要的格式、内容。现有技术PropertyGrid枚举显示中文，有一些利用了绑定自定义控件，有一些绑定自定义的IList对象。但是，每个枚举都要建立自己的TypeConverter,如果在架构设计中，一般都是分层实现，这样的横跨直接影响了分层结构，破坏系统的原本。有没有一种更好的办法来实现呢？本文也就这一问题进行了研究。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;本文的实现原理：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff6600;"&gt;在TypeConverter中对枚举类型进行转换，但是这个TypeConverter针对的所有的枚举对象，所有的枚举转换器都可以采用此接口，在枚举显示的时候调用TypeConverter，通过反射获得相对应的枚举描述。这样所有的枚举就只定义一个TypeConverter。也就解决上述问题。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;具体事例：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1、定义枚举：&lt;/strong&gt;在枚举中加入描述信息，作为我们需要显示的信息&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;enum&lt;/span&gt;&lt;span style="color: #000000;"&gt; PKGenerator&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 根据主键类型自动生成主键&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        [Description(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;自动生成&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br /&gt;        AutoGenerate&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 自定义主键&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        [Description(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;自定义&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br /&gt;        User_Defined &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 由外面传入&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        [Description(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;外部传入&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br /&gt;        Outer &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2、定义TypeConverter&lt;/strong&gt;，对枚举和选择进行转换&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 枚举转换器&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 用此类之前，必须保证在枚举项中定义了Description&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; EnumConverter : ExpandableObjectConverter&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 枚举项集合&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        Dictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; dic;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 构造函数&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; EnumConverter()&lt;br /&gt;        {&lt;br /&gt;            dic &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Dictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 加载枚举项集合&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="context"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; LoadDic(ITypeDescriptorContext context)&lt;br /&gt;        {&lt;br /&gt;            dic &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetEnumValueDesDic(context.PropertyDescriptor.PropertyType);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 是否可从来源转换&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="context"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="sourceType"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; CanConvertFrom(ITypeDescriptorContext context, Type sourceType)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (sourceType &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;))&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;.CanConvertFrom(context, sourceType);&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 从来源转换&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="context"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="culture"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="value"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; value)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (value &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;is&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;如果是枚举&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (context.PropertyDescriptor.PropertyType.IsEnum)&lt;br /&gt;                {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (dic.Count &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                        LoadDic(context);&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (dic.Values.Contains(value.ToString()))&lt;br /&gt;                    {&lt;br /&gt;                        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; obj &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; dic.Keys)&lt;br /&gt;                        {&lt;br /&gt;                            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (dic[obj] &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; value.ToString())&lt;br /&gt;                            {&lt;br /&gt;                                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; obj;&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;.ConvertFrom(context, culture, value);&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 是否可转换&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="context"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="destinationType"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; CanConvertTo(ITypeDescriptorContext context, Type destinationType)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="context"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetStandardValuesSupported(ITypeDescriptorContext context)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="context"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetStandardValuesExclusive(ITypeDescriptorContext context)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="context"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;ListAttribute listAttribute = (ListAttribute)context.PropertyDescriptor.Attributes[typeof(ListAttribute)];&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;StandardValuesCollection vals = new TypeConverter.StandardValuesCollection(listAttribute._lst);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Dictionary&amp;lt;object, string&amp;gt; dic = GetEnumValueDesDic(typeof(PKGenerator));&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;StandardValuesCollection vals = new TypeConverter.StandardValuesCollection(dic.Keys);&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (dic &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;||&lt;/span&gt;&lt;span style="color: #000000;"&gt; dic.Count &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                LoadDic(context);&lt;br /&gt;&lt;br /&gt;            StandardValuesCollection vals &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; TypeConverter.StandardValuesCollection(dic.Keys);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; vals;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="context"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="culture"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="value"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="destinationType"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; value, Type destinationType)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;DescriptionAttribute.GetCustomAttribute(&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;EnumDescription&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;List&amp;lt;KeyValuePair&amp;lt;Enum, string&amp;gt;&amp;gt; mList = UserCombox.ToListForBind(value.GetType());&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;foreach (KeyValuePair&amp;lt;Enum, string&amp;gt; mItem in mList)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;{&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;    if (mItem.Key.Equals(value))&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;    {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;        return mItem.Value;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;    }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;}&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;return "Error!";&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;绑定控件&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;            FieldInfo fieldinfo = value.GetType().GetField(value.ToString());&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Object[] objs = fieldinfo.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false);&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;if (objs == null || objs.Length == 0)&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;{&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;    return value.ToString();&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;}&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;else&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;{&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;    System.ComponentModel.DescriptionAttribute da = (System.ComponentModel.DescriptionAttribute)objs[0];&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;    return da.Description;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;}&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (dic.Count &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                LoadDic(context);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; key &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; dic.Keys)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (key.ToString() &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; value.ToString() &lt;/span&gt;&lt;span style="color: #000000;"&gt;||&lt;/span&gt;&lt;span style="color: #000000;"&gt; dic[key] &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; value.ToString())&lt;br /&gt;                {&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; dic[key].ToString();&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;.ConvertTo(context, culture, value, destinationType);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 记载枚举的值+描述&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="enumType"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Dictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetEnumValueDesDic(Type enumType)&lt;br /&gt;        {&lt;br /&gt;            Dictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; dic &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Dictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;            FieldInfo[] fieldinfos &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; enumType.GetFields();&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (FieldInfo field &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; fieldinfos)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (field.FieldType.IsEnum)&lt;br /&gt;                {&lt;br /&gt;                    Object[] objs &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; field.GetCustomAttributes(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(DescriptionAttribute), &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (objs.Length &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                    {&lt;br /&gt;                        dic.Add(Enum.Parse(enumType, field.Name), ((DescriptionAttribute)objs[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]).Description);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; dic;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3、属性使用TypeConverter：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; EntityKey&lt;br /&gt;    {&lt;br /&gt;        [Description(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;主键生成方式&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), DisplayName(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;主键生成方式&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br /&gt;        [TypeConverter(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(EnumConverter))]&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; PKGenerator PKGenerator&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;具体效果如下图：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/22790/2011091713562988.png" alt="" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yank/aggbug/2179598.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yank/archive/2011/09/17/PropertyGrid_Enum.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yank/archive/2011/09/08/EnumDisplayInChinese.html</id><title type="text">枚举显示中文问题</title><summary type="text">在使用枚举的时候，经常为显示中文而烦恼。有人使用中文枚举，影响代码统一，而且无法支持多语，难以扩展。本文利用反射、描述信息来解决此问题。之前也介绍相关技术，但是这里重点再提示下。</summary><published>2011-09-08T02:41:00Z</published><updated>2011-09-08T02:41:00Z</updated><author><name>停留的风</name><uri>http://www.cnblogs.com/yank/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yank/archive/2011/09/08/EnumDisplayInChinese.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yank/archive/2011/09/08/EnumDisplayInChinese.html"/><content type="html">&lt;p style="margin-top: 10px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-indent: 0px;"&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 10px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-indent: 0px;"&gt;有人为了显示中文，这样定义枚举吗？&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;enum&lt;/span&gt;&lt;span style="color: #000000;"&gt; TimeOfDay&lt;br /&gt;    {&lt;br /&gt;        上午,&lt;br /&gt;        下午,&lt;br /&gt;        晚上&lt;br /&gt;    };&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这样定义，很别扭，特别是在使用的时候，&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;比如，this.Time = TimeOfDay.上午;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;而且你会逐渐发现它的局限性。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;枚举定义很头疼：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在系统开发中，我们经常使用枚举，但是定义枚举是个头疼的问题。&lt;/p&gt;&#xD;
&lt;p style="margin-top: 10px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-indent: 0px;"&gt;按照习惯我们习惯将枚举项定义为英语，但是，在使用的时候，特别针对国内客户的时候，如果显示的英文，则不符合要求，不易于用户使用。&lt;/p&gt;&#xD;
&lt;p style="margin-top: 10px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-indent: 0px;"&gt;尽管现在枚举定义也能定义中文枚举项，但在优雅的英文代码中穿插着中语，确实很不爽。如果涉及多语，很难扩展。&lt;/p&gt;&#xD;
&lt;p style="margin-top: 10px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-indent: 0px;"&gt;也有人经常用到常量来代替枚举，但这种方法在系统开发中不太可取，具体见：&lt;a href="http://www.cnblogs.com/yank/archive/2009/02/27/1399423.html"&gt;枚举与常量&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p style="margin-top: 10px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-indent: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 10px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-indent: 0px;"&gt;这时候我们肯定在埋怨：&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;如果是计算机是咱们中国人发明的，也许我们就没这个问题。&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 10px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-indent: 0px;"&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 10px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-indent: 0px;"&gt;&lt;strong&gt;解决方案：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 10px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-indent: 0px;"&gt;但是这是没法改变的事实。我们只能加点转换功能变成我们想要的东西了。下面提供解决方案：&lt;/p&gt;&#xD;
&lt;p style="margin-top: 10px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-indent: 0px;"&gt;为了方便用户使用，&amp;nbsp;希望能够找到一种比较好的方法，将枚举转为我们想要的集合。通过反射，得到针对某一枚举类型的描述。&lt;/p&gt;&#xD;
&lt;p style="margin-top: 10px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-indent: 0px;"&gt;枚举的定义中加入描述，如果要支持多语，则直接修改枚举描述即可。也不用修改其他代码。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" style="background-color: #f5f5f5; font-family: 'Courier New'; font-size: 13px; word-break: break-all; overflow-x: auto; overflow-y: auto; width: 975px; border-width: 1px; border-color: #cccccc; border-style: solid; padding: 5px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.ComponentModel;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;enum&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;TimeOfDay&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Description(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;上午&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Moning,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Description(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;下午&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Afternoon,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Description(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;晚上&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Evening,&lt;br /&gt;};&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p style="margin-top: 10px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-indent: 0px;"&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 10px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-indent: 0px;"&gt;&lt;strong&gt;方法1：&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('8b178338-30c4-4bd7-80ac-e132ec30a23f')"&gt;&#xD;
&lt;div id="cnblogs_code_open_8b178338-30c4-4bd7-80ac-e132ec30a23f" &gt;&#xD;
&lt;pre&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 返回 Dic&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;枚举项，描述&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="enumType"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;Dic&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;枚举项，描述&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; Dictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetEnumDic(Type enumType)&lt;br /&gt;        {&lt;br /&gt;            Dictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; dic &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Dictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;            FieldInfo[] fieldinfos &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; enumType.GetFields();&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (FieldInfo field &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; fieldinfos)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (field.FieldType.IsEnum)&lt;br /&gt;                {&lt;br /&gt;                    Object[] objs &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; field.GetCustomAttributes(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(DescriptionAttribute), &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;                    dic.Add(field.Name, ((DescriptionAttribute)objs[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;]).Description);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; dic;&lt;br /&gt;        }&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p style="margin-top: 10px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-indent: 0px;"&gt;&lt;strong&gt;方法2：&lt;/strong&gt;　获得值和表述的键值对&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('8f49c3ab-8990-4c02-92ea-3243426d1a42')"&gt;&#xD;
&lt;div id="cnblogs_code_open_8f49c3ab-8990-4c02-92ea-3243426d1a42" &gt;&#xD;
&lt;pre&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 从枚举类型和它的特性读出并返回一个键值对&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="enumType"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;Type,该参数的格式为typeof(需要读的枚举类型)&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;键值对&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; NameValueCollection GetNVCFromEnumValue(Type enumType)&lt;br /&gt;        {&lt;br /&gt;            NameValueCollection nvc &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; NameValueCollection();&lt;br /&gt;            Type typeDescription &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(DescriptionAttribute);&lt;br /&gt;            System.Reflection.FieldInfo[] fields &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; enumType.GetFields();&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; strText &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Empty;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; strValue &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Empty;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (FieldInfo field &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; fields)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (field.FieldType.IsEnum)&lt;br /&gt;                {&lt;br /&gt;                    strValue &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ((&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;)enumType.InvokeMember(field.Name, BindingFlags.GetField, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)).ToString();&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] arr &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; field.GetCustomAttributes(typeDescription, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (arr.Length &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                    {&lt;br /&gt;                        DescriptionAttribute aa &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (DescriptionAttribute)arr[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;                        strText &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; aa.Description;&lt;br /&gt;                    }&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                    {&lt;br /&gt;                        strText &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; field.Name;&lt;br /&gt;                    }&lt;br /&gt;                    nvc.Add(strValue,strText);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; nvc;&lt;br /&gt;        }&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;具体用例下载地址：&lt;a href="http://files.cnblogs.com/yank/EnumApp.rar"&gt;http://files.cnblogs.com/yank/EnumApp.rar&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yank/aggbug/2170971.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yank/archive/2011/09/08/EnumDisplayInChinese.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yank/archive/2011/06/09/2076013.html</id><title type="text">Directx简介</title><summary type="text">(Direct eXtension，简称DX)是由微软公司创建的多媒体编程接口。由C++编程语言实现，遵循COM。被广泛使用于Microsoft Windows、Microsoft Xbox和Microsoft Xbox 360电子游戏开发，并且只能支持这些平台。最新版本为DirectX 11，创建在最新的Windows 7上。</summary><published>2011-06-09T01:19:00Z</published><updated>2011-06-09T01:19:00Z</updated><author><name>停留的风</name><uri>http://www.cnblogs.com/yank/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yank/archive/2011/06/09/2076013.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yank/archive/2011/06/09/2076013.html"/><content type="html">&lt;p&gt;&lt;strong&gt;DirectX&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;(&lt;/strong&gt;Direct eXtension，简称DX)是由微软公司创建的多媒体编程接口。由C++编程语言实现，遵循COM。被广泛使用于Microsoft Windows、Microsoft Xbox和Microsoft Xbox 360电子游戏开发，并且只能支持这些平台。最新版本为DirectX 11，创建在最新的Windows 7上。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;简介&lt;/strong&gt;　　&amp;nbsp; &lt;br /&gt;Microsoft DirectX 是这样一组技术：它们旨在使基于 Windows 的计算机成为运行和显示具有丰富多媒体元素（例如全色图形、视频、3D 动画和丰富音频）的应用程序的理想平台。 DirectX 包括安全和性能更新程序，以及许多涵盖所有技术的新功能。应用程序可以通过使用 DirectX API 来访问这些新功能。&lt;br /&gt;&lt;strong&gt;功能&lt;/strong&gt;&lt;br /&gt;　　DirectX加强3d图形和声音效果，并提供设计人员一个共同的硬件驱动标准，让游戏开发者不必为每一品牌的硬件来写不同的驱动程序，也降低用户安装及设置硬件的复杂度。从字面意义上说，Direct就是直接的意思，而后边的X则代表了很多的意思，从这一点上我们就可以看出DirectX的出现就是为了为众多软件提供直接服务的。 　　举个例子，骨灰级玩家（玩游戏比较长的）以前在DOS下玩游戏时，可不像我们现在，安装上就可以玩了，他们往往首先要先设置声卡的品牌和型号，然后还要设置IRQ（中断）、I/O（输入与输出）、DMA（存取模式），如果哪项设置的不对，那么游戏声音就发不出来。这部分的设置不仅让玩家伤透脑筋，而且对游戏开发者来说就更头痛了，因为为了让游戏能够在众多电脑中正确运行，开发者必须在游戏制作之初,便需要把市面上所有声卡硬件数据都收集过来，然后根据不同的 API（应用编程接口）来写不同的驱动程序，这对于游戏制作公司来说，是很难完成的，所以说在当时多媒体游戏很少。微软正是看到了这个问题，为众厂家推出了一个共同的应用程序接口&amp;mdash;&amp;mdash;DirectX，只要这个游戏是依照Directx来开发的，不管你是什么显卡、声卡、统统都能玩，而且还能发挥更佳的效果。当然，前提是你的显卡、声卡的驱动程序也必须支持DirectX才行。&lt;br /&gt;&lt;strong&gt;组成：&lt;/strong&gt;&lt;br /&gt;　DirectX是由很多API组成的，按照性质分类，可以分为四大部分，显示部分、声音部分、输入部分和网络部分。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yank/aggbug/2076013.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yank/archive/2011/06/09/2076013.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yank/archive/2010/12/12/1903898.html</id><title type="text">【1.2.5】嵌入式操作系统</title><summary type="text">定义、架构、特点</summary><published>2010-12-12T12:22:00Z</published><updated>2010-12-12T12:22:00Z</updated><author><name>停留的风</name><uri>http://www.cnblogs.com/yank/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yank/archive/2010/12/12/1903898.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yank/archive/2010/12/12/1903898.html"/><content type="html">&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;&lt;br /&gt;　　定义可从几方面来理解嵌入式系统：&lt;br /&gt;　　◆嵌入式系统是面向用户、面向产品、面向应用的，它必须与具体应用相结合才会具有生命力、才更具有优势。因此可以这样理解上述三个面向的含义，即嵌入式系统是与应用紧密结合的，它具有很强的专用性，必须结合实际系统需求进行合理的裁减利用。&lt;br /&gt;　　◆嵌入式系统是将先进的计算机技术、半导体技术和电子技术和各个行业的具体应用相结合后的产物，这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。所以，介入嵌入式系统行业，必须有一个正确的定位。例如Palm 之所以在PDA领域占有70％以上的市场，就是因为其立足于个人电子消费品，着重发展图形界面和多任务管理；而风河的Vxworks之所以在火星车上得以应用，则是因为其高实时性和高可靠性。&lt;br /&gt;　　◆嵌入式系统必须根据应用需求对软硬件进行裁剪，满足应用系统的功能、可靠性、成本、体积等要求。所以，如果能建立相对通用的软硬件基础，然后在其上开发出适应各种需要的系统，是一个比较好的发展模式。目前的嵌入式系统的核心往往是一个只有几K到几十K微内核，需要根据实际的使用进行功能扩展或者裁减，但是由于微内核的存在，使得这种扩展能够非常顺利的进行。&lt;br /&gt;　　实际上，嵌入式系统本身是一个外延极广的名词，凡是与产品结[嵌入式实时操作系统uC/OS-II]嵌入式实时操作系统uC/OS-II合在一起的具有嵌入式特点的控制系统都可以叫嵌入式系统，而且有时很难以给它下一个准确的定义。现在人们讲嵌入式系统时，某种程度上指近些年比较热的具有操作系统的嵌入式系统，本文在进行分析和展望时，也沿用这一观点。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;构架&lt;/strong&gt;&lt;br /&gt;　　一般而言，嵌入式系统的构架可以分成四个部分：处理器、存储器、输入输出（I/O）和软件（由于多数嵌入式设备的应用软件和操作系统都是紧密结合的，在这里我们对其不加区分，这也是嵌入式系统和Windows系统的最大区别）。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;重要特征&lt;/strong&gt;&lt;br /&gt;　　这些年来掀起了嵌入式系统应用热潮的原因主要有几个方面：一是芯片技术的发展，使得单个芯片具有更强的处理能力，而且使集成多种接口已经成为可能，众多芯片生产厂商已经将注意力集中在这方面。另一方面的原因就是应用的需要，由于对产品可靠性、成本、更新换代要求的提高，使得嵌入式系统逐渐从纯硬件实现和使用通用计算机实现的应用中脱颖而出，成为近年来令人关注的焦点。&lt;br /&gt;　　从上面的定义，我们可以看出嵌入式系统的几个重要特征：&lt;br /&gt;　　1）系统内核小。由于嵌入式系统一般是应用于小型电子装置的，系统资源相对有限，所以内核较之传统的操作系统要小得多。比如Enea公司的OSE分布式系统，内核只有5K，而Windows的内核？简直没有可比性。&lt;br /&gt;　　2）专用性强。嵌入式系统的个性化很强，其中的软件&amp;nbsp;&amp;nbsp; [4种嵌入式操作系统的调度机制]4种嵌入式操作系统的调度机制系统和硬件的结合非常紧密，一般要针对硬件进行系统的移植，即使在同一品牌、同一系列的产品中也需要根据系统硬件的变化和增减不断进行修改。同时针对不同的任务，往往需要对系统进行较大更改，程序的编译下载要和系统相结合，这种修改和通用软件的&amp;ldquo;升级&amp;rdquo;是完全两个概念。&lt;br /&gt;　　3）系统精简。嵌入式系统一般没有系统软件和应用软件的明显区分，不要求其功能设计及实现上过于复杂，这样一方面利于控制系统成本，同时也利于实现系统安全。&lt;br /&gt;　　4）高实时性的系统软件(OS)是嵌入式软件的基本要求。而且软件要求固态存储，以提高速度；软件代码要求高质量和高可靠性。&lt;br /&gt;　　5）嵌入式软件开发要想走向标准化，就必须使用多任务的操作系统。嵌入式系统的应用程序可以没有操作系统直接在芯片上运行；但是为了合理地调度多任务、利用系统资源、系统函数以及和专家库函数接口，用户必须自行选配RTOS（Real－Time Operating System）开发平台，这样才能保证程序执行的实时性、可靠性，并减少开发时间，保障软件质量。&lt;br /&gt;　　6）嵌入式系统开发需要开发工具和环境。由于其本身不具备自举开发能力，即使设计完成以后用户通常也是不能对其中的程序功能进行修改的，必须有一套开发工具和环境才能进行开发，这些工具和环境一般是基于通用计算机上的软硬件设备以及各种逻辑分析仪、混合信号示波器等。开发时往往有主机和目标机的概念，主机用于程序的开发，目标机作为最后的执行机，开发时需要交替结合进行。&lt;/p&gt;&#xD;
&lt;p&gt;http://baike.baidu.com/view/18554.htm&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yank/aggbug/1903898.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yank/archive/2010/12/12/1903898.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yank/archive/2010/12/12/1903883.html</id><title type="text">【1.2.4】网络操作系统</title><summary type="text">1、计算机网络概述2、客户/服务器模式3、网络操作系统的功能4、网络操作系统提供的服务5、支持Internet与Intranet的功能和服务6、网络操作系统的类型</summary><published>2010-12-12T11:49:00Z</published><updated>2010-12-12T11:49:00Z</updated><author><name>停留的风</name><uri>http://www.cnblogs.com/yank/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yank/archive/2010/12/12/1903883.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yank/archive/2010/12/12/1903883.html"/><content type="html">&lt;p&gt;1、计算机网络概述&lt;/p&gt;&#xD;
&lt;p&gt;2、客户/服务器模式&lt;/p&gt;&#xD;
&lt;p&gt;3、网络操作系统的功能&lt;/p&gt;&#xD;
&lt;p&gt;4、网络操作系统提供的服务&lt;/p&gt;&#xD;
&lt;p&gt;5、支持Internet与Intranet的功能和服务&lt;/p&gt;&#xD;
&lt;p&gt;6、网络操作系统的类型&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yank/aggbug/1903883.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yank/archive/2010/12/12/1903883.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
