iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#自定义特性(Attribute)详解
  • 772
分享到

C#自定义特性(Attribute)详解

2024-04-02 19:04:59 772人浏览 薄情痞子
摘要

在前面介绍的代码中有使用特性,这些特性都是Microsoft定义好的,作为.net Framework类库的一部分,许多特性都得到了C#编译器的支持。.NET Frmework也允许

在前面介绍的代码中有使用特性,这些特性都是Microsoft定义好的,作为.net Framework类库的一部分,许多特性都得到了C#编译器的支持。
.NET Frmework也允许定义自己的特性。自定义特性允许把自定义元数据与程序元素关联起来。这些元数据是在编译过程中创建的,并嵌入到程序集中。这些特性不会影响编译过程,因为编译器不能识别它们,但这些特性在应用于程序元素时,可以在编译好的程序集中用作元数据。这些元数据在文档说明中很有用。使自定义特性起很大作用的是反射https://www.jb51.net/article/244259.htm)技术,代码可以读取这些元数据,使用它们在运行期间作决策。

编写自定义特性

[FieldName("Social")]
        public string SocialNumber
        {
            ...
        }

当C#编译器发现SocialNumber属性应用了一个FieldName特性时,首先会把字符串Attribute追加到FieldName这个名称后面,形成一个组合名称FieldNameAttribute,然后在其搜索路径的所有名称空间(即在using语句中提及的名称空间)中搜索FieldNameAttribute类。但如果该特性的名称以字符串Attribute结尾,编译器就不会把这个字符串加到组合名称中。
因此上面的代码等价于:

[FieldNameAttribute("Social")]
        public string SocialNumber
        {
            ...
        }

1.AttributeUsage特性

自定义的特性类需要直接或间接派生自System.Attribute。这个类还应包含控制用法的信息:

  • *特性可以应用到哪些类型的程序元素上(类,结构,属性和方法等)
  • *特性是否可以多次应用到同一个程序元素上
  • *特性在应用到类或接口上时,是否由派生类和接口继承
  • *这个特性有哪些必选和可选参数

如果编译器找不到对应的特性类,或者找到一个这样的特性类,但使用特性的方式与特性类中的信息不匹配,编译器就会产生一个编译错误。
定义FieldNameAttribute特性

[AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=false)]
        public class FieldNameAttribute:Attribute
        {
            private string name;
            public FieldNameAttribute(string name)
            {
                this.name = name;
            }
        }

特性类FieldNameAttribute本身用了一个特性System.AttributeUsage来标记。这是Microsoft定义的一个特性,C#编译器为它提供了特殊的支持。AttributeUsage主要用于标识自定义特性可以应用到哪些类型的程序元素上。这些信息由它的第一个参数AttributeTargets给出,该参数是必选的,其类型是枚举类型AttributeTargets。上面的例子,指定FieldNameAttribute特性只能应用到属性上。
AttributeTargets枚举的成员如下:

上面列出了可以应用该特性的所有程序元素。在把特性应用到程序元素上时,应把特性放在元素前面的方括号中:

  [FieldName("Social")]
  public string SocialNumber
  {
    ...
  }

但在应用到Assembly和Module时,特性可以应用到整个程序集或模块中,而不是应用到代码中的一个元素上,在这种情况下,这个特性可以放在源代码的任何地方,但需要使用关键字Assembly和Module作为前缀:

  [assembly:FieldName("Social")]
  [module:FieldName("Social")]

在指定自定义特性的有效目标元素时,可以使用OR运算符(|)把这些值组合起来:

  [AttributeUsage(AttributeTargets.Property |AttributeTargets.Field,
    AllowMultiple=false, Inherited=false)]
  public class FieldNameAttribute:Attribute
  {
    private string name;
    public FieldNameAttribute(string name)
    {
      this.name = name;
    }
  }

也可以使用AttributeTargets.All指定自定义特性可以应用到所有类型的程序元素上。
AttributeUsage特性还包含另外两个参数:AllowMultiple和Inherited。它们用不同的语法来指定:参数名 = 参数值,而不是只给出这些参数的值。这些参数是可选的。

  • AllowMultiple参数表示一个特性是否可以多次应用到同一项上。
  • Inherited参数表示应用到类或接口上的特性是否自动应用到所以派生的类或接口上。如果特性应用到方法或属性上,它就自动应用到它们的重写版本上。

2.指定特性参数

  [FieldName("Social")]
  public string SocialNumber
  {
    ...
  }

编译器会检查传递给特性的参数(在本例中,是一个字符串),并产兆该特性类中带这些参数的构造函数。如果找到匹配的构造函数,编译器就会把指定的元数据传递给程序集。如果找不到,就会生成一个编译错误。反射()会从程序集中读取元数据,并实例化它们表示的特性类。因此,编译器需要确保存在这样的构造函数,才能在运行期间实例化指定的特性。

3.特性的可选参数

在AttributeUsage特性中,使用参数名 = 参数值语法把可选参数添加到特性中。这种语法指定可选参数的名称和值,它通过特性类中的公共属性或字段起作用:

[AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=false)]
        public class FieldNameAttribute:Attribute
        {
            private string name;
            public FieldNameAttribute(string name)
            {
                this.name = name;
            }
            
            public string Comment
            {
                get;set;
            }
        }
        
        
        [FieldName("Social",Comment="可选参数值")]
        public string SocialNumber
        {
            ...
        }

到此这篇关于C#自定义特性(Attribute)的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#自定义特性(Attribute)详解

本文链接: https://www.lsjlt.com/news/145774.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#自定义特性(Attribute)详解
    在前面介绍的代码中有使用特性,这些特性都是Microsoft定义好的,作为.NET Framework类库的一部分,许多特性都得到了C#编译器的支持。.NET Frmework也允许...
    99+
    2024-04-02
  • SpringBoot2新特性 自定义端点详解
    SpringBoot2新特性 自定义端点 package com.yan.otlan.springboot; import org.springframework.boot.a...
    99+
    2024-04-02
  • C#特性(Attribute)
    一、什么是特性 特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明...
    99+
    2024-04-02
  • C#如何创建自定义特性
    目录概述实现方式概述 特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。...
    99+
    2024-04-02
  • C#特性怎么定义
    本篇内容主要讲解“C#特性怎么定义”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#特性怎么定义”吧!一、什么是特性特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构...
    99+
    2023-06-29
  • 怎么在C#中创建一个自定义特性
    这期内容当中小编将会给大家带来有关怎么在C#中创建一个自定义特性,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。实现方式声明自定义特性,一个新的自定义特性应派生自 System.Attribute 类。//...
    99+
    2023-06-14
  • C#中Attribute特性的用法
    开篇语 本文开始之前,首先我想问下大家对于属性和特性知道多少?属性和特性又有何区别? 对于该单词,我更想把它称之为:特性。对于属性和特性就是名称上有纠葛(不知道你们迷不迷,反正我写...
    99+
    2024-04-02
  • C语言:自定义类型详解
    目录一、结构体1.结构体变量的定义及初始化2.结构体内存对齐3.为什么要内存对齐呢?二、位段1.什么是位段2.位段的内存分配三、枚举1.枚举的定义2.枚举的优点四、联合(共用体)1....
    99+
    2024-04-02
  • C语言中自定义类型详解
    目录结构大小offsetof结构体对齐规则存在原因总结结构大小 我们先随便给出一个结构体,为了计算他的大小,我给出完整的打印方案: typedef struct num { cha...
    99+
    2024-04-02
  • 最新C语言自定义类型详解
    目录前言结构体结构体的基础知识结构和数组的区别结构体的声明结构体的特殊声明 结构体的自引用我们能不能结构体套结构体呢?那么怎么实现结构体自引用呢?结构体变量的定义和初始化我...
    99+
    2023-01-13
    C语言 自定义类型 C自定义类型详解
  • 详解React自定义Hook
    目录前言如何自定义 Hooks组件之间共享逻辑自定义 Hooks 允许你共享有状态逻辑,而不是状态本身分类功能型 HooksuseWindowWidthuseLocalStorage...
    99+
    2023-05-17
    React自定义Hook React Hook
  • JavaSpringBoot自定义starter详解
    目录一、什么是SpringBoot starter机制二、为什么要自定义starter ?三、什么时候需要创建自定义starter?四、自定义starter的开发流程(案例...
    99+
    2024-04-02
  • C/C++ Qt TableDelegate 自定义代理组件使用详解
    TableDelegate 自定义代理组件的主要作用是对原有表格进行调整,例如默认情况下Table中的缺省代理就是一个编辑框,我们只能够在编辑框内输入数据,而有时我们想选择数据而不是...
    99+
    2024-04-02
  • JAVA自定义注解详情
    目录原理:元注解:@Retention参数讲解:案例:给一个类的String属性设置默认值总结原理: 注解的本质是继承Annotation的特殊接口,其具体实现类是Java运行时生成...
    99+
    2024-04-02
  • Java自定义注解的详解
    Java自定义注解Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容。在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解。Java1.5引入了注解,当前许多java框架中大量使用...
    99+
    2023-05-31
    java 自定义 注解
  • Vue自定义指令详解
    目录Vue自定义指令自定义指令钩子函数输出相关属性运用例子总结Vue自定义指令 自定义指令 注册一个全局指令v-focus,该指令的功能是在页面加载时元素获得焦点 <!DO...
    99+
    2024-04-02
  • Android自定义View-Paint详解
    Paint的使用 setStyle Paint.Style.FILL:填充模式 Paint.Style.STROKE:画线模式 Paint.Style.FI...
    99+
    2024-04-02
  • SpringBoot之自定义Banner详解
    1、在线生成banner网站 https://www.bootschool.net/ascii http://www.network-science.de/ascii/ http...
    99+
    2024-04-02
  • JavaScript中的this指向和自定义属性详解
    目录1.this关键字2.自定义属性3.综合案例1:tab选项卡的实现附录总结1.this关键字 this指向的是当前元素 全局函数中的this指向window对象 代码中声明...
    99+
    2024-04-02
  • C#实现自定义ListBox背景的示例详解
    目录实践过程效果代码实践过程 效果 代码 public partial class DrawListBox : ListBox { public Draw...
    99+
    2022-12-16
    C#自定义ListBox背景 C# ListBox背景 C# ListBox
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作