当前位置: 首页 > news >正文

网站26个页面收费低代码开发平台免费开源

网站26个页面收费,低代码开发平台免费开源,国内搜索引擎大全,成都制作网站公司简介相关文章 [C#]Attribute特性 [C#]Attribute特性(2)——方法的特性及特性参数 AttributeUsage特性 除了可以定制自己的特性来注释常用的C#类型外#xff0c;您可以用AttributeUsage特性来定义您想怎样使用这些特性。AttributeUsage特性采用如下的调用惯例#xff1a; 1 [Attri…相关文章       [C#]Attribute特性       [C#]Attribute特性(2)——方法的特性及特性参数 AttributeUsage特性      除了可以定制自己的特性来注释常用的C#类型外您可以用AttributeUsage特性来定义您想怎样使用这些特性。AttributeUsage特性采用如下的调用惯例 1 [AttributeUsage( 2 3 Validon, 4 5 AllowMultipleallowmultiple, 6 7 Inheritedinherited 8 9 )]       您可以非常容易地区别出哪些是定位参数哪些是命名参数。强烈建议您在记录您的特性时采用这种格式以便不必通过查看特性类的源代码您的用户即可以找到哪些公共的读/写字段和属性可以用作命名特性。 定义一个特性目标      现在让我们再来看看AttributeUsage特性您会注意到validon参数是一个定位的必需的参数。这个参数使您的特性都能附加给哪些类型。确切地说AttributeUsage特性中的validon参数是AttributeTargets类型的它事实上是按如下方式定义的一种枚举 1 Public enum AttributeTargets2 3 {4 5 // 摘要:6 7 // 可以对程序集应用属性。8 9 Assembly 0x0001,10 11 //12 13 // 摘要:14 15 // 可以对模块应用属性。16 17 Module 0x0002,18 19 //20 21 // 摘要:22 23 // 可以对类应用属性。24 25 Class 0x0004,26 27 //28 29 // 摘要:30 31 // 可以对结构应用属性即值类型。32 33 Struct 0x0008,34 35 //36 37 // 摘要:38 39 // 可以对枚举应用属性。40 41 Enum 0x0010,42 43 //44 45 // 摘要:46 47 // 可以对构造函数应用属性。48 49 Constructor 0x0020,50 51 //52 53 // 摘要:54 55 // 可以对方法应用属性。56 57 Method 0x0040,58 59 //60 61 // 摘要:62 63 // 可以对属性 (Property) 应用属性 (Attribute)。64 65 Property 0x0080,66 67 //68 69 // 摘要:70 71 // 可以对字段应用属性。72 73 Field 0x0100,74 75 //76 77 // 摘要:78 79 // 可以对事件应用属性。80 81 Event 0x0200,82 83 //84 85 // 摘要:86 87 // 可以对接口应用属性。88 89 Interface 0x0400,90 91 //92 93 // 摘要:94 95 // 可以对参数应用属性。96 97 Parameter 0x0800,98 99 // 100 101 // 摘要: 102 103 // 可以对委托应用属性。 104 105 Delegate 0x1000, 106 107 // 摘要: 108 109 // 可以对任何应用程序元素应用属性。 110 111 All Assembly|Module|Class|Struct|Enum|Constructor|Method|Property|Field|Event|Interface|Parameter|Delegate, 112 113 ClassMemberClass|Struct|Enum|Constructor|Method|Property|Field|Event|Delegate|Interface, 114 115 } AttributeTargets      注意当使用AttributeUsage特性时您可以指定AttributeTargets.All这样的话这个特性就可以附加给任何在AttributeTargets枚举中列出的类型了。这是在您不指定AttributeTargets特性时的默认方式。假如AttributeTargets.All是默认值您可能会觉得奇怪为什么您还要使用validon值。其原因就是命名参数可以在这个特性上使用您也许要改变他们其中的一个。但是您要记住如果您使用了一个命名参数您必须把它放在所有的定位参数的后面。这可以让您很方便地指定您想使用的特性采用AttributeTargets.All默认值同时您仍然可以设置它们的命名参数。      那么在什么时候并且为什么您指定这个validonAttributeTargets参数在任何您想完全控制怎样使用一个特性时您都可以使用这个参数。在上面的这些例子中我们创建了一个只有类才能使用的RemoteObjectAttribute特性还创建了一个只能用在方法上的TransactionableAttribute特性以及一个只对字段有作用的RegistryKeyAttribute特性。如果我们想让这些特性只注释在设计时它们所注释的那些类型我们可以这样来定义它们此处为简明起见略去了特性的主体 1 [AttributeUsage(AttributeTargets.Class)]2 public class RemoteObjectAttribute:Attribute3 4 {5 6 ......7 8 }9 [AttributeUsage(AttributeTargets.Method)] 10 public class TransactionableAttribute : Attribute 11 12 { 13 public TransactionableAttribute() { } 14 } 15 16 [AttributeUsage(AttributeTargets.Field)] 17 public class RegistryKeyAttribute : Attribute 18 { 19 ......... 20 }      最后关于AttributeTargets枚举有一点要提一下您可以使用“|”操作符来组合成员。如果您有一个既要应用到字段和又要应用到属性的特性您就可以按如下格式来附加这个AttributeUsage特性 1 [AttributeUsage(AttributeTargets.Field|AttributeTargets.Property)] 单次特性和多次特性       您可以用AttributeUsage来把特性定义为单次或者是多次的特性。使用哪种形式取决于一个单的特性在一段单独的字段里的使用次数。在默认形式下所有的特性都是单次的这以为着在编译如下代码时将导致一个编译错误 1 public class SigleUseAttribute : Attribute2 {3 public SigleUseAttribute(string str)4 { }5 }6 7 //ErrorThis results in a “duplicate attribute ” complier error.8 [SigleUse(abc)]9 [SigleUse(def)] 10 public class MyClass 11 { 12 ...... 13 }       为了解决这个问题您需要在AttributeUsage那一行指定您要把这个特性多次附加给某些类型。具体方法如下 1 [AttributeUsage(AttributeTargets.All, AllowMultiple true)]2 public class SigleUseAttribute : Attribute3 {4 public SigleUseAttribute(string str)5 { }6 }7 [SigleUse(abc)]8 [SigleUse(def)]9 public class MyClass 10 { 11 12 }       您可能用到这种方法的一个实际例子就是用在“特性的定义”一节中所讨论到的RegistryKeyAttribute特性上。因为我们知道一个字段可能会存储在注册表的多个地方您可能需要就像这里的代码一样通过AllowMultiple 命名参数把AttributeUsage特性附加给它们。 指定继承特性的规则       AttributeUsageAttribute特性的最后一个参数就是他的inherited标记即用来标识这个特性是否可以继承。它的默认值是false。但是如果inherited标记被设置成true那么它还需要看AllowMultiple 标记的值。如果inherited标记为true而AllowMultiple 标记为false这个特性就不再有继承特性了。不过如果标记是true并且AllowMultiple 标记也是true这个特性就可以累加到这个成员上。 特性标识符       请看一下下面的代码并试着标出这个特性是否注释了其中的返回值或方法 1 public class MyClass 2 { 3 [HRESULT] 4 public long Foo(); 5 }       如果您具有COM编程经验的话您就会知道HRESULT是所有错了名为AddRef或Release的方法的基本返回类型。不过我们可以很容易就明白如果特性的名字既可以用于返回值又可以用于方法名的或编译器就不可能知道您的用意到底是什么。下面是编译器不能根据上下文掌握您的真正用意的其他一些情况 方法和返回类型 事件、字段和属性委托和返回类型属性、存取器、getter方法的返回值和setter方法的值参数      在这些情况下编译器根据它所认为的最可能的原则来进行判断。为了不让这种判断出现您可以使用下面所列出的特性标识符 assemblymoduletypemethodpropertyeventfieldparamreturn       要使用特性标识符只需在这个特性名字前面加上所需的标识符和一个冒号即可。在MyClass例子中如果您想保证编译器能够判断出HRESULT是用来注释返回值而不是其中的方法您就可以这样指定标识符 1 public class MyClass 2 { 3 [return:HRESULT] 4 public long Foo(); 5 } 总结       C#特性提供了这样一种机制就是在设计时可以用信息来对类型和成员进行注释并且可以在运行时通过反射来获取这些信息。这使您可以真正创建自我包含的、自我描述的组件而不必借助于向一些资源文件和常量中填塞一些必须的琐碎信息。这样有利于编出更简单、更易于维护、移植性更强的组件。      本文来自《c#技术内幕》记录在次方便自己方便他人.....
http://www.pierceye.com/news/152103/

相关文章:

  • 国内做网站技术支持 网站建设
  • 绍兴做团购的网站织梦转易优cms
  • 百度 网站 质量度扬州市工程建设招标网
  • 营销网站建设流程图优化营商环境发言稿
  • 设计网站公司有哪些怎么做网店
  • 高端的网站设计费用外贸营销型网站建设平台
  • 买源码做网站简单嘛贵阳百度seo点击软件
  • 省建设注册管理网站网站的维护和推广
  • wordpress 插件站wordpress本地mp3
  • 爱站工具包的主要功能很有设计感的企业网站
  • 地下城钓鱼网站如何做iis添加网站无法访问
  • 招聘网站大全网站开发liucheng
  • erlang做网站优势深圳集团网站建设公司好
  • 烟台公司建网站seo网站推广 沈阳
  • 没有网站做APP企业网站模板建站
  • 国内炫酷的网站首页网站开发交易平台
  • 大型网站建设公司制作网站好大夫在线免费咨询
  • 有哪些设计的很优秀的网站诸暨市住房建设局网站
  • 建设网站网站建站延吉手机网站建设开发
  • 网站建设一意见08wordpress主题
  • 做网站备案不少天网络设计包括哪些
  • 仿腾讯视频网站源码个人制作网站工具
  • 泉州网站制作建设163注册企业邮箱
  • 漳州市建设局网站6热e国产-网站正在建设中-手机版
  • 给公司做网站数据分析江门网站设计制作
  • 怎么做新网站安宁网站建设熊掌号
  • com是什么网站网络科技公司可以去吗
  • 抖音创作者服务平台上海seo培训中心
  • 自己做网站app甘肃网站域名申请公司
  • 电子商务网站开发的课程介绍2023年新闻摘抄