.net----特性

news2024/12/23 23:24:09

特性

  • 特性的概念和使用
    • 特性(Attribute)
    • 特性形式
    • 特性类参数
  • 预定义通用特性类
    • ConditionalAttribute类
    • ObsoleteAttribute类
    • AttributeUsageAttribute类
    • 全局特性
  • 自定义特性类
  • 使用反射访问特性

特性的概念和使用

特性(Attribute)

  • 特性类:直接或间接派生于抽象类System.Attribute的类

  • 放置在其他声明上,即附加到各种程序实体(包括类型、方法、属性等),以添加元数据信息

  • 主要为编译器提供额外的信息,编译器可以通过这些附加特性,自动生成相应的代码,从而实现特定的功能

  • 程序代码也可以通过反射技术,在运行时环境中检索这些特性信息,以实现特定的操作

特性形式

公共语言运行库(CLR)中预定义的特性
自定义特性

特性类参数

  • 定位参数和命名参数列表

  • 将方括号中的特性名置于其适用的实体声明之前

[DllImport(“user32.dll”, SetLastError=false, ExactSpelling=false)]
[Conditional(“DEBUG”),Conditional(“TEST1”)]

预定义通用特性类

ConditionalAttribute类

  • Conditional特性通过测试条件编译符号来确定适用的条件

  • 采用一个或多个Conditional特性修饰

  • 条件特性类

  • 条件方法

  • 标记为条件方法的调用取决于是否定义了预处理符号

public class MyTrace
{
[Conditional( "DEBUG" )]
public static void Msg(string msg) { Console.WriteLine(msg); }

[Conditional( "DEBUG" ), Conditional( "TRACE" )]
public static void Method2()
{
    Console.WriteLine("DEBUG or TRACE is defined");
}
}

MyTrace.Msg("Now in Main..."); MyTrace.Method2();
Console.WriteLine("Main Done."); 

ObsoleteAttribute类

  • 将实体标记为一个建议不再使用的实体,在产品的未来版本中将被移除

  • 当调用使用Obsolete特性标记的实体时,编译器会生成警告

  • 两个定位参数:string类型的message和bool类型的error

  • 如果Obsolete特性的第2个参数为true时,则产生错误信息

  • 例12.2
    [System.Obsolete(“use NewMethod”, true )]

AttributeUsageAttribute类

  • 应用于自定义特性类,以控制如何应用新特性

  • AttributeUsage特性修饰的类必须直接或间接从System.Attribute 派生

  • AttributeUsage特性可以设置3个参数:

  • ValidOn参数

  • AllowMultiple参数

  • Inherited参数

全局特性

调用方信息特性类
用于跟踪和调试
获取关于调用方的信息传递给方法,包括源代码路径、行号、方法或属性的名称
在这里插入图片描述

  • 适用于整个程序集或模块
    全局特性在源代码中出现在顶级using指令之后,类型或命名空间声明之前

  • 【例12.4】基于Visual Studio的Windows 窗体应用程序模板的项目中,将自动创建一个名为 AssemblyInfo.cs 的文件,该文件包括若干全局特性

自定义特性类

  • 通过直接或间接地从System.Attribute类派生创建

  • 特性类的声明遵循下列规则:

  • 派生类的类名一般采用XXXAttribute的命名规范,类名就是特性名

  • 构造函数的参数是自定义特性的定位参数

  • 任何公共读写字段或属性都是命名参数

  • 使用AttributeUsage特性指定特性类的限制条件

[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct,
AllowMultiple = true) ] //允许单个实体应用多次该特性
public class AuthorAttribute : System.Attribute
    {
        private string name; public double version;

        public AuthorAttribute(string name)
        {
            this.name = name; version = 1.0;
        }
    }
    [Author("Qingsong YU", version = 1.1)]
    [Author("Hong JIANG", version = 1.2)]
    class SampleClass
    {   //书写关于Qingsong YU的代码...
        //书写关于Hong JIANG的代码...
   }

使用反射访问特性

  • C#使用反射技术来检索用自定义特性定义的信息

  • 首先,通过GetType方法或者typeof关键字来获取类型

  • 然后,通过GetCustomAttributes方法获取所应用的自定义特性的对象数组

  • 最后,通过自定义特性的对象数组进行相应的操作处理

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = true) 
public class AuthorAttribute : Attribute{…….}
……
[Author("Qingsong YU")]
class FirstClass { }
……
PrintAuthorInfo(typeof(FirstClass));
……

private static void PrintAuthorInfo(System.Type t)
{
Attribute[] attrs = Attribute.GetCustomAttributes(t);//反射技术
foreach (Attribute attr in attrs)
{
    ……
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

http请求报头header

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一.认识请求报头(header) 1.Host 2.content-length 3.content-type 常见的三种格式 小结 二.User-Agent(简称UA) 三.Referer 四.C…

进程创建进程终止进程等待

目录前言一、进程创建1.fork()函数(1)fork()函数的基本认识进程调用fork()函数之后,控制权转移到内核中的fork()代码之后,内核做了啥?(2)实验:使用fork()函数创建进程(3&…

跨境电商卖家必知的【圣诞节营销】终极指南(一)

关键词:圣诞节营销、跨境电商卖家 不知不觉又到了年底,而对于跨境电商来说也是非常重要的一段促销时期,也许您已经制定了相关的圣诞节营销大促,但今天我们还是想告诉您一些2022年非常棒的销的创意想法,希望能帮助您提升…

Spring Cloud Alibaba(四)

openFeign配置日志 一、openFeign的日志级别: NONE:不记录日志 (默认). BASIC:只记录请求方法、url、响应状态码和执行时间。 HEADERS:在basic的基础上,增加请求和响应头 FULL:记录请求和响应的头、body…

PyTorch搭建RNN联合嵌入模型(LSTM GRU)实现视觉问答(VQA)实战(超详细 附数据集和源码)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一、视觉问题简介 视觉问答(VQA)是一种同时设计计算机视觉和自然语言处理的学习任务。简单来说,VQA就是对给定的图片进行问答,一个VQA系统以一张图片和一个关于这张图片形式自…

用HTML+CSS+JS写的切水果小游戏它来了

前言 切水果游戏曾经是一款风靡手机的休闲游戏,今天要分享的就是一款网页版的切水果游戏, 由HTMLCSSJS实现,虽然功能和原版的相差太大,但基本的功能具备,效果逼真。感兴趣的小伙伴可收藏学习(完整源码在文…

Heterogeneous Parallel Programming 异构并行编程 - UIUC伊利诺伊大学(持续更新)

Lecture 11.2 Introduction to Heterogeneous异构1.3 Portability and Scalability1.4 Introduction to CUDA 数据并行化 and 执行模型1.5 Introduction to CUDA 内存模型 and 基本函数API1.6 Introduction to CUDA Kernel-based SPMD1.7 更高维的Grid的Kernel-based SPMD例子1…

Linux的基本协议与他的堂兄堂弟

14天学习训练营导师课程: 互联网老辛《 符合学习规律的超详细linux实战快速入门》 努力是为了不平庸~ 学习有些时候是枯燥的,但收获的快乐是加倍的,欢迎记录下你的那些努力时刻(学习知识点/题解/项目实操/遇到的bug/等等&#xf…

教程一 在Go使用JavaScript、HTML和CSS构建Windows、Linux、MacOSX跨平台的桌面应用

Energy是Go语言使用JavaScript、HTML和CSS构建跨平台的桌面应用程序可用于构建跨平台的桌面应用内嵌 Chromium CEF 二进制 环境安装 Energy 命令行工具 使用命令行工具自动安装Energy框架的所有依赖(CEF),支持Window、Linux、MacOSX 安装过程从网络下载CEF和Energy…

二、vue基础入门

一、vue简介 1.1、什么是vue 官方给出的概念:Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的前端框架。 1.2、vue的特性 vue框架的特性,主要体现在如下两方面: 数据驱动视图双向数据绑定 1.2.1、数据驱动视图 在…

高灵敏度艾美捷小鼠肿瘤坏死因子α-ELISpot试剂盒

肿瘤坏死因子-a(TNF-a)由许多不同的细胞类型产生,例如单核细胞,巨噬细胞,T细胞和B细胞。在TNF-a的许多作用中,有针对细菌感染,细胞生长调节,免疫系统调节和参与败血症性休克的保护。…

现代气象仪器 | 太阳辐射测量

南京信息工程大学 实验(实习)报告 实验(实习)名称 现代气象仪器 实验(实习)日期 10.28 得分 指导老师 学院 电信院 专业 电子信息工程 年级 2020 班次 4 姓名 学号 20208327 实验…

万字博客带你全面剖析Spring的依赖注入

1.写在前面 前面的博客我们已经写了Spring的依赖查找,这篇博客我们来了解写Spring的依赖注入。 2.依赖注入的模式和类型 手动模式 - 配置或者编程的方式, 提前安排注入规则 XML 资源配置元信息Java 注解配置元信息API 配置元信息 自动模式 - 实现方…

华为机试 - 最大括号深度

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 现有一字符串仅由 ‘(‘,’)’,{‘,’}’,[‘,’]’六种括号组成。 若字符串满足以下条件之一,则为无效字符串: ①…

【MySQL】拿来即用 —— MySQL中的数据类型

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ MySQL数据类型⚪熟悉SQL一、MySQL数据类型总结…

设备树和设备树语法

设备树 驱动代码只负责处理驱动的逻辑,而关于设备的具体信息存放到设备树文件中。许多硬件设备信息可以直 接通过它传递给 Linux,而不需要在内核中堆积大量的冗余代码。 设备树,将这个词分开就是“设备”和“树”,描述设备树的文…

【计算机毕业设计】22.毕业设计选题系统ssm源码

一、系统截图(需要演示视频可以私聊) 引言 近年来,电子商务发展的愈趋成熟使得人们的消费方式以及消费观念发生巨大改变,网上竞拍的拍卖模式随之发展起来。大学拍卖网旨在为湘大学生提供一个线上拍卖的交易平台。平台展示的商品大…

【American English】美式发音,英语发音,美国音音标列表及发音

首先声明,网上各种英式发音和美式发音的教程,而我的目的是寻找美式发音。但是自己现在也是在不断地找寻中,所以资料找错了请莫怪。另外,资料顺序采用部分倒叙,不喜请勿吐槽。 文章目录发音示意图49. [](https://www.bi…

百度地图有感

以前总认为坚持会让我们变强大,但是长大后发现,让我们强大的,是放下。 生活也许就是这样,多一分经验便少一分幻想,以实际的愉快平衡现实的痛苦。 百度地图开放平台 百度地图入门指南 百度地图开发指南 百度地图API文…

性早熟和微生物群:性激素-肠道菌群轴的作用

谷禾健康 肠道菌群 & 性激素 青春期是生命的一个关键阶段,与性成熟相关的生理变化有关,是一个受多种内分泌和遗传控制调控的复杂过程。 青春期发育可以在适当的时候,早熟或延迟。 未经治疗的性早熟的孩子通常不会达到成年身高的全部潜力。…