windows C#-使用反射访问特性

你可以定义自定义特性并将其放入源代码中这一事实,在没有检索该信息并对其进行操作的方法的情况下将没有任何价值。 通过使用反射,可以检索通过自定义特性定义的信息。 主要方法是 GetCustomAttributes,它返回对象数组,这些对象在运行时等效于源代码特性。 此方法有许多重载版本。 

特性规范,例如:

[Author("P. Ackerman", Version = 1.1)]
class SampleClass { }

在概念上等效于以下代码:

var anonymousAuthorObject = new Author("P. Ackerman")
{Version = 1.1
};

但是,在为特性查询 SampleClass 之前,代码将不会执行。 对 SampleClass 调用 GetCustomAttributes 会导致构造并初始化一个 Author 对象。 如果该类具有其他特性,则将以类似方式构造其他特性对象。 然后 GetCustomAttributes 会以数组形式返回 Author 对象和任何其他特性对象。 之后你便可以循环访问此数组,根据每个数组元素的类型确定所应用的特性,并从特性对象中提取信息。

下面是完整的示例。 定义自定义特性、将其应用于多个实体,并通过反射对其进行检索。

// Multiuse attribute.
[System.AttributeUsage(System.AttributeTargets.Class |System.AttributeTargets.Struct,AllowMultiple = true)  // Multiuse attribute.
]
public class AuthorAttribute : System.Attribute
{string Name;public double Version;public AuthorAttribute(string name){Name = name;// Default value.Version = 1.0;}public string GetName() => Name;
}// Class with the Author attribute.
[Author("P. Ackerman")]
public class FirstClass
{// ...
}// Class without the Author attribute.
public class SecondClass
{// ...
}// Class with multiple Author attributes.
[Author("P. Ackerman"), Author("R. Koch", Version = 2.0)]
public class ThirdClass
{// ...
}class TestAuthorAttribute
{public static void Test(){PrintAuthorInfo(typeof(FirstClass));PrintAuthorInfo(typeof(SecondClass));PrintAuthorInfo(typeof(ThirdClass));}private static void PrintAuthorInfo(System.Type t){System.Console.WriteLine($"Author information for {t}");// Using reflection.System.Attribute[] attrs = System.Attribute.GetCustomAttributes(t);  // Reflection.// Displaying output.foreach (System.Attribute attr in attrs){if (attr is AuthorAttribute a){System.Console.WriteLine($"   {a.GetName()}, version {a.Version:f}");}}}
}
/* Output:Author information for FirstClassP. Ackerman, version 1.00Author information for SecondClassAuthor information for ThirdClassR. Koch, version 2.00P. Ackerman, version 1.00
*/
如何使用特性创建 C/C++ 联合

通过使用特性,可自定义结构在内存中的布局方式。 例如,可使用 StructLayout(LayoutKind.Explicit) 和 FieldOffset 特性在 C/C++ 中创建所谓的联合。

在此代码段中,TestUnion 的所有字段均从内存中的同一位置开始。

[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]
struct TestUnion
{[System.Runtime.InteropServices.FieldOffset(0)]public int i;[System.Runtime.InteropServices.FieldOffset(0)]public double d;[System.Runtime.InteropServices.FieldOffset(0)]public char c;[System.Runtime.InteropServices.FieldOffset(0)]public byte b;
}

以下代码是另一个示例,其中的字段从不同的显式设置位置开始。

[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]
struct TestExplicit
{[System.Runtime.InteropServices.FieldOffset(0)]public long lg;[System.Runtime.InteropServices.FieldOffset(0)]public int i1;[System.Runtime.InteropServices.FieldOffset(4)]public int i2;[System.Runtime.InteropServices.FieldOffset(8)]public double d;[System.Runtime.InteropServices.FieldOffset(12)]public char c;[System.Runtime.InteropServices.FieldOffset(14)]public byte b;
}

组合的两个整数字段 i1 和 i2 与 lg 共享相同的内存位置。 lg 使用前 8 个字节,或 i1 使用前 4 个字节且 i2 使用后 4 个字节。 使用平台调用时,这种对结构布局的控制很有用。 

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

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

相关文章

七牛云AIGC内容安全方案助力企业合规创新

随着人工智能生成内容(AIGC)技术的飞速发展,内容审核的难度也随之急剧上升。在传统审核场景中,涉及色情、政治、恐怖主义等内容的标准相对清晰明确,但在AIGC的应用场景中,这些界限变得模糊且难以界定。用户可能通过交互性引导AI生成违规内容,为审核工作带来了前所未有的不可预测…

《物联网智能项目》

一、引言 随着科技的不断进步,物联网(Internet of Things,IoT)已经成为当今世界最具发展潜力的领域之一。物联网智能项目通过将各种设备、传感器和系统连接到互联网,实现了智能化的监测、控制和管理,为人们…

告别 Kafka,拥抱 Databend:构建高效低成本的用户行为分析体系

用户行为数据埋点指标是数据仓库中不可或缺的重要数据源之一,同时也是企业最宝贵的资产之一。通常情况下,用户行为数据分析包含两大数据源:用户行为分析日志和上游关系型数据库(如 MySQL)。基于这些数据,企…

什么是JSON,有什么特点

什么是 JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于 JavaScript 的子集,但独立于语言,被广泛用于服务器与 Web 应…

数据结构 (8)线性表的应用——一元多项式的表示及应用

一、一元多项式的定义 一元多项式是代数学研究的基本对象之一,可以表示为: P_n(x) p_0 p_1x p_2xn 其中,p_0, p_1, ..., p_n 是数域 F 中的数,n 是非负整数,x 是变量。 二、一元多项式的线性表表示 在计算机中&…

如何安全高效地打开和管理动态链接库(DLL)?系统提示dll丢失问题的多种有效修复指南

动态链接库(DLL)文件是Windows操作系统中非常重要的一部分,它们包含了程序运行所需的代码和数据。当系统提示DLL文件丢失时,可能会导致应用程序无法正常运行。以下是一些安全高效地打开和管理DLL文件以及修复DLL丢失问题的方法&am…

缓存方案分享

不知道大家平常更新缓存是怎么做的,但是大部分时候都是更新数据的同时更新缓存,今天和同事一起聊到一个缓存方案的问题,感觉很有趣、非常精妙,记录一下。 基于此本文将介绍几种常见的缓存更新策略,包括简单的缓存覆盖…

基于微信小程序的平价药房管理系统+LW参考示例

1.项目介绍 系统角色:管理员、医生、普通用户功能模块:用户管理、医生管理、药品分类管理、药品信息管理、在线问诊管理、生活常识管理、日常提醒管理、过期处理、订单管理等技术选型:SpringBoot,Vue,uniapp等测试环境…

鸿蒙ArkUI-X已更新适配API13啦

ArkUI-X 5.0.1 Release版配套OpenHarmony 5.0.1 Rlease,API 13,新增适配部分API 13接口支持跨平台;框架能力进一步完善,支持Android应用非压缩模式,支持Android Fragment对接跨平台。ACE Tools工具易用性提升&#xff…

图片预览 图片上传到服务器

首先要明白 理解 multipart/form-data:‌multipart/form-data是一种在HTTP请求中使用的MIME类型,主要用于在客户端和服务器之间传输包含文件或二进制数据的表单数据。它通过一个边界(boundary)来分隔不同的表单字段和文件数据‌。…

京准电钟:NTP网络校时服务器从入门到精准

京准电钟:NTP网络校时服务器从入门到精准 京准电钟:NTP网络校时服务器从入门到精准 1.前言 由计算机网络系统组成的分布式系统,若想协调一致进行:IT行业的“整点开拍”、“秒杀”、“Leader选举”,通信行业的“同步…

《生成式 AI》课程 第3講 CODE TASK执行文章摘要的机器人

课程 《生成式 AI》课程 第3講:訓練不了人工智慧嗎?你可以訓練你自己-CSDN博客 任务1:总结 1.我们希望你创建一个可以执行文章摘要的机器人。 2.设计一个提示符,使语言模型能够对文章进行总结。 model: gpt-4o-mini,#gpt-3.5-turbo, import…

【人工智能】深入解析GPT、BERT与Transformer模型|从原理到应用的完整教程

在当今人工智能迅猛发展的时代,自然语言处理(NLP)领域涌现出许多强大的模型,其中GPT、BERT与Transformer无疑是最受关注的三大巨头。这些模型不仅在学术界引起了广泛讨论,也在工业界得到了广泛应用。那么,G…

Python开发环境搭建+conda管理环境

下载Miniconda 推荐从清华镜像下载安装包 Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 打开网页后,下拉到最后找到Miniconda3-latest前缀的文件,或者网页中直接搜索Miniconda3-latest,都可以找…

CSS:怎么把网站都变成灰色

当大家看到全站的内容都变成了灰色,包括按钮、图片等等。这时候我们可能会好奇这是怎么做到的呢? 有人会以为所有的内容都统一换了一个 CSS 样式,图片也全换成灰色的了,按钮等样式也统一换成了灰色样式。但你想想这个成本也太高了…

第三方数据库连接免费使用和安装

是强大的一体化数据库开发解决方案,可从单一应用程序无缝连接多个数据库,包括 MySQL、PostgreSQL、MongoDB、MariaDB、SQL Server、Oracle、SQLite 和 Redis。 下载:https://download.csdn.net/download/mo3408/90045937 升级特性 模型&…

python控制鼠标,键盘,adb

python控制鼠标,键盘,adb 听说某系因为奖学金互相举报,好像拿不到要命一样。不禁想到几天前老墨偷走丁胖子的狗,被丁胖子逮到。他面对警察的问询面不改色坚持自我,反而是怒气冲冲的丁胖子被警察认为是偷狗贼。我觉得这…

使用 exe4j 将 Spring Boot 项目打包为 EXE 可执行文件

使用 exe4j 将 Spring Boot 项目打包为 EXE 可执行文件 文章目录 使用 exe4j 将 Spring Boot 项目打包为 EXE 可执行文件什么是 exe4j准备工作打包 Spring Boot 项目为 EXE 文件1.启动 exe4j2. 选择项目类型3. 配置项目名称和输出目录4. 配置项目类型或可执行文件名称5. java配…

【操作文档】mysql分区操作步骤.docx

1、建立分区表 执行 tb_intercept_notice表-重建-添加分区.sql 文件; DROP TABLE IF EXISTS tb_intercept_notice_20241101_new; CREATE TABLE tb_intercept_notice_20241101_new (id char(32) NOT NULL COMMENT id,number varchar(30) NOT NULL COMMENT 号码,cre…

使用 pycharm 新建不使用 python 虚拟环境( venv、conda )的工程

有时候我们发现一个好玩的 demo,想赶快在电脑上 pip install 一下跑起来,发现因为 python 的 venv、conda 环境还挺费劲的,因为随着时间的发展,之前记得很清楚的 venv、conda 的用法,不经常使用,半天跑不起…