100165365.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 172 行 · 第 1/2 页
HTM
172 行
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Delegate = 0x00001000, </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Enum = 0x00000010, </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Event = 0x00000200, </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Field = 0x00000100, </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Interface = 0x00000400, </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Method = 0x00000040, </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Module = 0x00000002, </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Parameter = 0x00000800, </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Property = 0x00000080, </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> ReturnValue = 0x00002000, </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Struct = 0x00000008 </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"><span style="FONT-FAMILY: 宋体">这个列表列出了该特性可以应用到所有的程序元素上。注意在把特性应用到程序元素上时,应把特性放在元素前面紧邻的方括号中。但是,在上面的列表中有两个值不对应于任何程序元素:</span><span lang="EN-US">Assembly</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">Module</span><span style="FONT-FAMILY: 宋体">。一个特性可以作为一个整体应用到程序集或模块中,而不是应用到代码中的一个元素上,在这种情况下,这个特性可以放在源代码的任何地方,但需要用关键字</span><span lang="EN-US">assembly</span><span style="FONT-FAMILY: 宋体">或</span><span lang="EN-US">module</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">[assembly: SomeAssemblyAttribute(Parameters)]</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">[module: SomeAssemblyAttribute(Parameters)]</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在指定定制特性的有效目标元素时,可以使用按位</span><span lang="EN-US">OR</span><span style="FONT-FAMILY: 宋体">运算符把这些值组合起来。例如,如果要指定</span><span lang="EN-US">FieldName</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"> [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field,</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> AllowMultiple=false,</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Inherited=false)]</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> public class FieldNameAttribute : Attribute</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">也可以使用</span><span lang="EN-US">AttributeTargets.All</span><span style="FONT-FAMILY: 宋体">指定特性可以应用到所有类型的程序元素上。</span><span lang="EN-US">AttributesUsage</span><span style="FONT-FAMILY: 宋体">特性还包含另外两个参数</span><span lang="EN-US">AllowMultiple </span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US"> Inherited</span><span style="FONT-FAMILY: 宋体">。它们用不同的语法来指定:</span><span lang="EN-US"><AttributeName>=<AttributeValue></span><span style="FONT-FAMILY: 宋体">,而不是只给出这些特性的值。这些参数是可选的,如果需要,可以忽略它们。</span></p>
<p class="MsoNormal"><span lang="EN-US">AllowMultiple</span><span style="FONT-FAMILY: 宋体">参数表示一个特性是否可以多次应用到同一个项目上,这里把它设置为</span><span lang="EN-US">false</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">[FieldName("SocialSecurityNumber")]</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">[FieldName("NationalInsuranceNumber")]</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">public string SocialSecurityNumber</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> // etc.</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">如果</span><span lang="EN-US">Inherited</span><span style="FONT-FAMILY: 宋体">参数设置为</span><span lang="EN-US">true</span><span style="FONT-FAMILY: 宋体">,就表示应用到类或接口上的特性也可以自动应用到所有派生的类或接口上。如果特性应用到方法或属性上,也可以自动应用到该方法或属性的重载上。</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">2. </span><span style="FONT-FAMILY: 黑体">指定特性参数</span></h4>
<p class="MsoNormal"><a ftel="parameters"><span style="FONT-FAMILY: 宋体">下面介绍如何指定定制特性的参数。在编译器遇到下述语句时:</span></a></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">[FieldName("SocialSecurityNumber")]</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">public string SocialSecurityNumber</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> // etc.</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">会检查传送给特性的参数</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">在本例中,是一个字符串</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">,并查找该特性中带这些参数的构造函数。如果找到一个这样的构造函数,编译器就会把指定的元数据传送给程序集。如果找不到,就生成一个编译错误。如后面所述,反射会从程序集中读取元数据,并实例化它们表示的特性类。因此,编译器需要存在这样的构造函数,才能在运行期间实例化指定的特性。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在本例中,仅为</span><span lang="EN-US">FieldNameAttribute</span><span style="FONT-FAMILY: 宋体">提供了一个构造函数,而这个构造函数有一个字符串参数。因此,在把</span><span lang="EN-US">FieldNameAttribute</span><span style="FONT-FAMILY: 宋体">特性应用到一个属性上时,必须为它提供一个字符串参数,如上面的代码所示。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">如果可以选择特性的参数类型,当然可以提供构造函数的不同重载方法,但一般是仅提供一个构造函数,使用属性来定义其他可选参数,下面将介绍可选参数。</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">3. </span><span style="FONT-FAMILY: 黑体">指定特性的可选参数</span></h4>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">AttributeUsage</span><span style="FONT-FAMILY: 宋体">特性中,可以使用另一个语法,把可选参数添加到特性中。这个语法指定可选参数的名称和值,处理特性类中的公共属性或字段。例如,假定修改</span><span lang="EN-US">SocialSecurityNumber</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">[FieldName("SocialSecurityNumber", Comment="This is the primary key field")]</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">public string SocialSecurityNumber</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="a6" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> // etc.</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在本例中,编译器识别第二个参数的语法</span><span lang="EN-US"><ParameterName>=<ParameterValue></span><span style="FONT-FAMILY: 宋体">,所以不会把这个参数传递给</span><span lang="EN-US">FieldNameAttribute</span><span style="FONT-FAMILY: 宋体">构造函数,而是查找一个有该名称的公用属性或字段</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">最好不要使用公用字段,所以一般情况下要使用属性</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">,编译器可以用这个属性设置第二个参数的值。如果希望上面的代码可以工作,必须给</span><span lang="EN-US">FieldNameAttribute</span><span style="FONT-FAMILY: 宋体">添加一些代码:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> [AttributeUsage(AttributeTargets.Property,</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> AllowMultiple=false,</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Inherited=false)]</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public class FieldNameAttribute : Attribute</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> private string comment;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public string Comment</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> get</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> return comment;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> set</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> comment = value;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> // etc.</span></p></div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100165364.htm">上一页</a> <a href="index.html">首页</a> <a href="100165366.htm">下一页</a>
</div>
<div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
<div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
图书导读
</div>
<div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
<!--导读-->
<h1 id="divCurrentNode2" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165365.htm'><font color='red'>10.1.1 编写定制特性</font></a></h1>
<div id="divRealteNod2" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165362.htm'>9.1.3 字典(2)</a></div><div style='float:right;width:49%'>·<a href='100165363.htm'>9.2 小结</a></div><div style='float:left;width:49%'>·<a href='100165364.htm'>10.1 定制特性</a></div><div style='float:right;width:49%'>·<a href='100165366.htm'>10.1.2 定制特性示例WhatsNewAttributes</a></div><div style='float:left;width:49%'>·<a href='100165367.htm'>10.2 反射</a></div><div style='float:right;width:49%'>·<a href='100165368.htm'>10.2.1 System.Type类</a></div></div>
</div>
</div>
</div>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?