news 2026/4/22 20:32:40

特性(Attribute)与反射

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
特性(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属性 } } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:21:01

Open Interpreter农业科技应用:无人机作业脚本生成

Open Interpreter农业科技应用:无人机作业脚本生成 1. 引言:农业智能化的自然语言编程新范式 随着精准农业的发展,无人机在农田监测、播种、喷洒等场景中的应用日益广泛。然而,编写高效、安全的无人机控制脚本仍依赖专业开发人员…

作者头像 李华
网站建设 2026/4/18 1:50:35

iOS应用优化终极指南:5个免越狱技巧重新定义手机体验

iOS应用优化终极指南:5个免越狱技巧重新定义手机体验 【免费下载链接】H5GG an iOS Mod Engine with JavaScript APIs & Html5 UI 项目地址: https://gitcode.com/gh_mirrors/h5/H5GG 在移动应用性能优化和功能扩展的领域,H5GG作为一款革命性…

作者头像 李华
网站建设 2026/4/18 3:36:10

HY-MT1.5-1.8B模型量化教程:INT8压缩后性能变化实测

HY-MT1.5-1.8B模型量化教程:INT8压缩后性能变化实测 1. 引言 随着边缘计算和实时翻译需求的不断增长,轻量化大模型部署成为关键挑战。HY-MT1.5-1.8B 是一款专为高效翻译任务设计的小参数量模型,在保持高质量翻译能力的同时,具备…

作者头像 李华
网站建设 2026/4/18 3:35:55

通义千问3-14B实战案例:教育领域智能问答系统搭建

通义千问3-14B实战案例:教育领域智能问答系统搭建 1. 引言:教育智能化的迫切需求与技术选型背景 随着在线教育和个性化学习的快速发展,传统教学辅助系统在响应质量、知识广度和交互能力上的局限日益凸显。尤其是在课程答疑、作业批改、知识…

作者头像 李华
网站建设 2026/4/18 3:37:27

VoxCPM方言支持实测:云端GPU免环境调试,一键试方言

VoxCPM方言支持实测:云端GPU免环境调试,一键试方言 你是不是也遇到过这样的问题:想用AI生成带地方口音的语音,比如四川话讲段子、上海话配短视频,或者粤语播新闻?但本地电脑配置不够,大模型根本…

作者头像 李华
网站建设 2026/4/18 1:56:58

如何高效处理中文数字日期转换?试试FST ITN-ZH大模型镜像

如何高效处理中文数字日期转换?试试FST ITN-ZH大模型镜像 在自然语言处理(NLP)的实际应用中,文本的标准化与逆标准化是不可或缺的一环。尤其是在语音识别、智能客服、会议纪要生成等场景中,系统输出的原始文本常包含大…

作者头像 李华