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

特性(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.jsqmd.com/news/246542/

相关文章:

  • AntiDupl.NET:重新定义数字资产管理新范式
  • VSCode Mermaid插件终极指南:一键解锁文档可视化新境界
  • 终极指南:Windows电脑直接安装安卓应用全攻略
  • 工业质检实战:用YOLOv10官版镜像快速实现缺陷识别
  • B站视频下载神器BilibiliDown:3大核心功能让你轻松获取高清资源
  • Windows环境下高效访问Linux文件系统的技术方案
  • 工业级ARM开发板选型与实践:核心要点分析
  • Cursor Pro免费激活完整指南:智能解锁终极教程
  • RemixIcon图标配色艺术:从心理学到技术实现的完美融合
  • 模型体积太大?YOLOE压缩与导出技巧分享
  • Fun-ASR-MLT-Nano-2512语音出版:书籍语音录入
  • Qwen3-4B适合初创企业吗?ROI分析与部署实战
  • Qwen/VL模型WebUI打不开?网络配置问题排查实战案例
  • 免费开源的文件元数据管理神器:FileMeta完整使用指南
  • Unsloth模型版本管理:Git集成最佳实践
  • 终极移动虚拟化:如何在安卓手机上运行Windows和Linux系统
  • 语音降噪实战|基于FRCRN语音降噪-单麦-16k镜像快速实现音频增强
  • 解锁Windows系统最佳B站体验:Bili.Uwp客户端深度解析
  • 揭秘MOFA:5步掌握多组学数据整合的核心技术
  • MOFA多组学分析终极指南:从零基础到实战高手
  • MinerU使用避坑指南:PDF文档处理常见问题全解
  • 网易云音乐一键下载工具完整使用指南
  • GPEN批量处理性能评测:多图修复部署案例,GPU显存优化方案
  • Axure RP界面显示问题终极解决方案:从英文界面到完整中文优化的完整指南
  • 35个专业级PowerBI主题模板:零基础打造惊艳数据可视化报表
  • Fillinger智能填充:从几何算法到设计艺术的终极进化
  • FSMN-VAD医疗语音应用:问诊录音切分系统搭建案例
  • 没显卡怎么玩Qwen?云端GPU镜像2块钱搞定,小白5分钟上手
  • AI智能证件照制作工坊轻量化部署:低配设备运行优化方案
  • 告别复杂配置!RexUniNLU开箱即用信息抽取方案