100165371.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 175 行 · 第 1/3 页
HTM
175 行
<p class="a6" style="MARGIN-TOP: 0cm; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">类</span><span lang="EN-US">WhatsNewChecker</span><span style="FONT-FAMILY: 宋体">包含主程序入口和其他方法。我们定义的所有方法都在这个类中,它还有两个静态字段:</span><span lang="EN-US">outputText</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">backDateTo</span><span style="FONT-FAMILY: 宋体">。</span><span lang="EN-US">outputText</span><span style="FONT-FAMILY: 宋体">包含在准备阶段创建的文本,这个文本要写到信息框中,</span><span lang="EN-US">backDateTo</span><span style="FONT-FAMILY: 宋体">存储了选择的日期<span style="LETTER-SPACING: -1pt">——</span>自从该日期以来的所有修改都要显示出来。一般情况下,需要显示一个对话框,让用户选择这个日期,但我们不想编写这段代码,以转移您的注意力。因此,把</span><span lang="EN-US">backDateTo</span><span style="FONT-FAMILY: 宋体">硬编码为日期</span><span lang="EN-US">2002</span><span style="FONT-FAMILY: 宋体">年</span><span lang="EN-US">2</span><span style="FONT-FAMILY: 宋体">月</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体">日。在下载这段代码时,很容易修改这个日期:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> class WhatsNewChecker</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> static StringBuilder outputText = new StringBuilder(1000);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> static DateTime backDateTo = new DateTime(2002, 2, 1);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> static void Main()</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> Assembly theAssembly = Assembly.Load("VectorClass");</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> Attribute supportsAttribute = </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> Attribute.GetCustomAttribute(</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> theAssembly, typeof(SupportsWhatsNewAttribute));</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> string Name = theAssembly.FullName;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> AddToMessage("Assembly: " + Name);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> if (supportsAttribute == null)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> AddToMessage( "This assembly does not support WhatsNew attributes");</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> return;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> else </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> AddToMessage("Defined Types:");</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> Type[] types = theAssembly.GetTypes();</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> foreach(Type definedType in types)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> DisplayTypeInfo(theAssembly, definedType);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> MessageBox.Show(outputText.ToString(), </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> "What\'s New since " + backDateTo.ToLongDateString());</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> Console.ReadLine();</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 15pt"><span lang="EN-US">Main()</span><span style="FONT-FAMILY: 宋体">方法首先加载</span><span lang="EN-US">VectorClass</span><span style="FONT-FAMILY: 宋体">程序集,验证它是否真的用</span><span lang="EN-US">SupportsWhatsNew</span><span style="FONT-FAMILY: 宋体">特性来标记。我们知道,</span><span lang="EN-US">VectorClass</span><span style="FONT-FAMILY: 宋体">应用了</span><span lang="EN-US">SupportsWhatsNew</span><span style="FONT-FAMILY: 宋体">特性,虽然才编译了该程序集,但进行这种检查还是必要的,因为用户可能希望检查这个程序集。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 15pt"><span style="FONT-FAMILY: 宋体">验证了这个程序集后,使用</span><span lang="EN-US">Assembly.GetTypes()</span><span style="FONT-FAMILY: 宋体">方法获得一个数组,其中包括在该程序集中定义的所有类型,然后在这个数组中迭代。对每种类型调用一个已编写的方法</span><span lang="EN-US">DisplayType Info()</span><span style="FONT-FAMILY: 宋体">,给</span><span lang="EN-US">outputText</span><span style="FONT-FAMILY: 宋体">字段添加相关的文本,包括</span><span lang="EN-US">LastModifiedAttribute</span><span style="FONT-FAMILY: 宋体">实例的信息。最后,显示带有完整文本的信息框。</span><span lang="EN-US">DisplayTypeInfo()</span><span style="FONT-FAMILY: 宋体">方法如下所示:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> static void DisplayTypeInfo(Assembly theAssembly, Type type)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> // make sure we only pick out classes</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> if (!(type.IsClass))</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> return;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> AddToMessage("\nclass " + type.Name);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> Attribute [] attribs = Attribute.GetCustomAttributes(type);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> if (attribs.Length == 0)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> AddToMessage("No changes to this class\n");</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> else</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> foreach (Attribute attrib in attribs)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> WriteAttributeInfo(attrib);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> MethodInfo [] methods = type.GetMethods();</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> AddToMessage("CHANGES TO METHODS OF THIS CLASS:");</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> foreach (MethodInfo nextMethod in methods)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> object [] attribs2 = </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> nextMethod.GetCustomAttributes(</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> typeof(LastModifiedAttribute), false);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> if (attribs != null)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> AddToMessage(</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 13pt; FTEL: 18.45pt"><span lang="EN-US"> nextMethod.ReturnType + " " + nextMethod.Name + "()");</span></p>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?