特性(Attribute)与反射

一、特性(Attribute)

特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。

特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。.Net 框架提供了两种类型的特性:预定义特性和自定义特性。

预定义特性(Attribute)

AttributeUsage

预定义特性 AttributeUsage 描述了如何使用一个自定义特性类。它规定了特性可应用到的项目的类型。规定该特性的语法如下:

[AttributeUsage( validon, AllowMultiple=allowmultiple, Inherited=inherited )]
  • 参数 validon 规定特性可被放置的语言元素。它是枚举器 AttributeTargets 的值的组合。默认值是 AttributeTargets.All。

  • 参数 allowmultiple(可选的)为该特性的 AllowMultiple 属性(property)提供一个布尔值。如果为 true,则该特性是多用的。默认值是 false(单用的)。

  • 参数 inherited(可选的)为该特性的 Inherited 属性(property)提供一个布尔值。如果为 true,则该特性可被派生类继承。默认值是 false(不被继承)。

Conditional

这个预定义特性标记了一个条件方法,其执行依赖于指定的预处理标识符。它会引起方法调用的条件编译,取决于指定的值,比如 Debug 或 Trace。例如,当调试代码时显示变量的值。

规定该特性的语法如下:

[Conditional( conditionalSymbol )]

Obsolete

这个预定义特性标记了不应被使用的程序实体。它可以让您通知编译器丢弃某个特定的目标元素。例如,当一个新方法被用在一个类中,但是您仍然想要保持类中的旧方法,您可以通过显示一个应该使用新方法,而不是旧方法的消息,来把它标记为 obsolete(过时的)。

规定该特性的语法如下:

[Obsolete( message )] [Obsolete( message, iserror )]

//AttributeTargets.Class 特性可以使用在类前
//AttributeTargets.Constructor 特性可以使用在构造函数前
//AttributeTargets.Field 特性可以使用在字段前
///AllowMultiple = true 特性是否能够多用

创建自定义特性(Attribute)

一个新的自定义特性应派生自 System.Attribute 类。例如:

// 一个自定义特性 BugFix 被赋给类及其成员 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] public class DeBugInfo : System.Attribute

//AttributeTargets.Class 特性可以使用在类前
//AttributeTargets.Constructor 特性可以使用在构造函数前
//AttributeTargets.Field 特性可以使用在字段前
///AllowMultiple = true 特性是否能够多用

二、反射(Reflection)

优缺点及用途

优点:

  1. 反射提高了程序的灵活性和扩展性。

  2. 降低耦合性,提高自适应能力。

  3. 它允许程序创建和控制任何类的对象,无需提前硬编码目标类。

缺点:

  1. 性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。

  2. 使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。

用途:

  • 它允许在运行时查看特性(attribute)信息。

  • 它允许审查集合中的各种类型,以及实例化这些类型。

  • 它允许延迟绑定的方法和属性(property)。

  • 它允许在运行时创建新类型,然后使用这些类型执行一些任务。

查看元数据

System.Reflection 类的 MemberInfo 对象需要被初始化,用于发现与类相关的特性(attribute)。为了做到这点,您可以定义目标类的一个对象,如下:

/使用特性 public class Rectangle1 { public int Width { get; set; } public int Length { get; set; } [MyAttribute("李四", "吃汉堡", Age = 21)] public int Area() { return Width * Length; } [MyAttribute("王五", "吃火锅", Age = 22)] public int ZhouChange() { return (Width + Length)*2; } }

/* 通过type访问类的方法
MethodInfo info = type.GetMethod("Area"); //获取类型对象的Area方法
//info.Invoke() 调用这个获取的方法,传递参数:类的对象
// 现在通过获取类型的对象,再获取类里面的方法,再去调用,这种使用反射实现类的访问
MessageBox.Show(info.Invoke(rectangle, new object[] { }) + "--------");
*/

/*通过type访问类的属性
PropertyInfo info = type.GetProperty("Width");
info.SetValue(rectangle,200 , null);
MessageBox.Show(rectangle.Width + "++++++");
*/

foreach (MethodInfo item in type.GetMethods()) { //item.GetCustomAttributes(true) 获取所有特性 foreach (object item1 in item.GetCustomAttributes(true)) { MyAttribute rect1 = item1 as MyAttribute; // 强制转换成特性类 if (rect1 != null) { MessageBox.Show(rect1.Name+"---"+rect1.Description + "---"+rect1.Age); // 特性类 Name属性 } } }

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

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

相关文章

AntiDupl.NET:重新定义数字资产管理新范式

AntiDupl.NET:重新定义数字资产管理新范式 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否有过这样的体验?电脑硬盘被无数相似图片占据&a…

VSCode Mermaid插件终极指南:一键解锁文档可视化新境界

VSCode Mermaid插件终极指南:一键解锁文档可视化新境界 【免费下载链接】vscode-markdown-mermaid Adds Mermaid diagram and flowchart support to VS Codes builtin markdown preview 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-markdown-mermaid …

终极指南:Windows电脑直接安装安卓应用全攻略

终极指南:Windows电脑直接安装安卓应用全攻略 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为电脑无法运行手机应用而烦恼吗?想在大屏幕上…

工业质检实战:用YOLOv10官版镜像快速实现缺陷识别

工业质检实战:用YOLOv10官版镜像快速实现缺陷识别 在现代制造业中,产品质量控制是保障生产效率和品牌信誉的关键环节。传统的人工视觉检测方式成本高、效率低且易出错,而基于深度学习的目标检测技术为工业质检提供了高效、精准的自动化解决方…

B站视频下载神器BilibiliDown:3大核心功能让你轻松获取高清资源

B站视频下载神器BilibiliDown:3大核心功能让你轻松获取高清资源 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_…

Windows环境下高效访问Linux文件系统的技术方案

Windows环境下高效访问Linux文件系统的技术方案 【免费下载链接】ext2read A Windows Application to read and copy Ext2/Ext3/Ext4 (With LVM) Partitions from Windows. 项目地址: https://gitcode.com/gh_mirrors/ex/ext2read 在跨平台开发与系统运维的实际工作中&a…

Cursor Pro免费激活完整指南:智能解锁终极教程

Cursor Pro免费激活完整指南:智能解锁终极教程 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial requ…

工业级ARM开发板选型与实践:核心要点分析

工业级ARM开发板选型实战:从原理到落地的硬核指南在某次为一家自动化设备厂商做技术评审时,我看到他们的原型机里用的是树莓派——这本无可厚非。但问题是,这台机器要部署在东北零下30℃的车间里,还要连接十几台伺服电机和PLC。结…

模型体积太大?YOLOE压缩与导出技巧分享

模型体积太大?YOLOE压缩与导出技巧分享 在深度学习模型部署过程中,模型体积过大和推理效率低下是开发者最常遇到的两大挑战。尤其是对于像 YOLOE 这类支持开放词汇表检测与分割的统一架构模型,虽然功能强大、泛化能力强,但其原始…

RemixIcon图标配色艺术:从心理学到技术实现的完美融合

RemixIcon图标配色艺术:从心理学到技术实现的完美融合 【免费下载链接】RemixIcon Open source neutral style icon system 项目地址: https://gitcode.com/gh_mirrors/re/RemixIcon 在当今数字化时代,图标配色已不再是简单的视觉装饰&#xff0c…

Fun-ASR-MLT-Nano-2512语音出版:书籍语音录入

Fun-ASR-MLT-Nano-2512语音出版:书籍语音录入 1. 章节名称 1.1 技术背景 随着多语言内容创作和数字出版的快速发展,语音识别技术在书籍语音录入、有声书制作等场景中扮演着越来越重要的角色。传统语音识别系统往往局限于单一语言或高资源语言&#xf…

Qwen3-4B适合初创企业吗?ROI分析与部署实战

Qwen3-4B适合初创企业吗?ROI分析与部署实战 1. 技术背景与选型动因 在当前AI驱动的创业环境中,语义理解能力已成为知识库、智能客服、内容推荐等核心功能的技术基石。对于资源有限的初创企业而言,如何在有限算力预算下实现高质量的文本向量…

Qwen/VL模型WebUI打不开?网络配置问题排查实战案例

Qwen/VL模型WebUI打不开?网络配置问题排查实战案例 1. 问题背景与场景描述 在部署基于 Qwen/Qwen3-VL-2B-Instruct 的视觉语言模型服务时,许多用户反馈:尽管镜像成功运行,但无法通过浏览器访问其集成的 WebUI 界面。该模型作为一…

免费开源的文件元数据管理神器:FileMeta完整使用指南

免费开源的文件元数据管理神器:FileMeta完整使用指南 【免费下载链接】FileMeta Enable Explorer in Vista, Windows 7 and later to see, edit and search on tags and other metadata for any file type 项目地址: https://gitcode.com/gh_mirrors/fi/FileMeta …

Unsloth模型版本管理:Git集成最佳实践

Unsloth模型版本管理:Git集成最佳实践 1. unsloth 简介 Unsloth 是一个开源的大型语言模型(LLM)微调与强化学习框架,旨在降低AI模型训练和部署的技术门槛。其核心目标是让人工智能技术更加准确、高效、易获取。通过深度优化底层…

语音降噪实战|基于FRCRN语音降噪-单麦-16k镜像快速实现音频增强

语音降噪实战|基于FRCRN语音降噪-单麦-16k镜像快速实现音频增强 1. 引言:语音增强的现实挑战与技术路径 在远程会议、在线教育、智能录音等应用场景中,环境噪声、设备采集失真等问题严重影响语音可懂度和用户体验。尤其在单麦克风采集条件下…

终极移动虚拟化:如何在安卓手机上运行Windows和Linux系统

终极移动虚拟化:如何在安卓手机上运行Windows和Linux系统 【免费下载链接】Vectras-VM-Android Its a Virtual Machine App for Android Which is Based on QEMU 项目地址: https://gitcode.com/gh_mirrors/ve/Vectras-VM-Android 你是否想过在手机上体验完整…

解锁Windows系统最佳B站体验:Bili.Uwp客户端深度解析

解锁Windows系统最佳B站体验:Bili.Uwp客户端深度解析 【免费下载链接】Bili.Uwp 适用于新系统UI的哔哩 项目地址: https://gitcode.com/GitHub_Trending/bi/Bili.Uwp 还在为浏览器看B站卡顿、功能受限而烦恼吗?作为Windows平台用户,你…

揭秘MOFA:5步掌握多组学数据整合的核心技术

揭秘MOFA:5步掌握多组学数据整合的核心技术 【免费下载链接】MOFA Multi-Omics Factor Analysis 项目地址: https://gitcode.com/gh_mirrors/mo/MOFA 多组学因子分析(MOFA)正在改变生物医学研究的面貌,它通过创新的矩阵分解…

MOFA多组学分析终极指南:从零基础到实战高手

MOFA多组学分析终极指南:从零基础到实战高手 【免费下载链接】MOFA Multi-Omics Factor Analysis 项目地址: https://gitcode.com/gh_mirrors/mo/MOFA 还在为多组学数据整合而头疼吗?面对转录组、蛋白质组、表观基因组等不同来源的海量数据&#…