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

news/2024/11/29 1:04:40/

你可以定义自定义特性并将其放入源代码中这一事实,在没有检索该信息并对其进行操作的方法的情况下将没有任何价值。 通过使用反射,可以检索通过自定义特性定义的信息。 主要方法是 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.ppmy.cn/news/1550770.html

相关文章

Unity类银河战士恶魔城学习总结(P142 Save System 保存系统)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了保存系统的初步建立 windows系统最终货币的保存文件被保存在如下路径下 SaveManager.cs 功能概述 SaveManager 是一个单例…

九、Ubuntu Linux操作系统

一、Ubuntu简介 Ubuntu Linux是由南非人马克沙特尔沃思(Mark Shutteworth)创办的基于Debian Linux的操作系统,于2004年10月公布Ubuntu是一个以桌面应用为主的Linux发行版操作系统Ubuntu拥有庞大的社区力量,用户可以方便地从社区获得帮助其官方网站:http…

在React中实践一些软件设计思想 ✅

策略设计模式 先写几句废话:其实在日常开发中,「设计模式」通常在不知不觉间已经被用了不少了,只是我们或许没察觉。比如通过插槽来增强组件的功能,这涉及到「装饰设计模式」;lodash或者jQuery的使用我觉得甚至算得上…

windows docker 入门

这个教程将指导你如何安装Docker、运行第一个容器以及理解一些基本概念。 第一步:安装Docker Desktop for Windows 系统要求: Windows 10 64位版本(专业版、企业版或教育版)。启用Hyper-V和Windows Subsystem for Linux (WSL 2)。…

React的基础知识:Context

1. Context 在 React 中,Context 提供了一种通过组件树传递数据的方式,无需手动在每个层级传递 props。这在处理一些全局应用状态时非常有用,比如用户认证、主题、语言偏好等。 如何使用 Context 创建 Context:首先,…

服务器记录所有用户docker操作,监控删除容器/镜像的人

文章目录 使用场景安装auditd添加docker审计规则设置监控日志大小与定期清除查询 Docker 操作日志查看所有用户,所有操作日志查看特定用户的 Docker 操作查看所有用户删除容器/镜像日志过滤特定时间范围内日志 使用场景 多人使用的服务器,使用的docker …

神经网络的数学——一个完整的例子

神经网络是一种人工智能方法,它教导计算机以类似于人脑的方式处理数据。神经网络通过输入多个数据实例、预测输出、找出实际答案与机器答案之间的误差,然后微调权重以减少此误差来进行学习。 虽然神经网络看起来非常复杂,但它实际上是线性代数…

我们来学mysql -- EXPLAIN之ref(原理篇)

EXPLAIN之ref 题记**ref** 题记 书接上文《 EXPLAIN之type》2024美国大选已定,川普剑登上铁王座,在此过程中出谋划策的幕僚很重要,是他们决定了最终的执行计划在《查询成本之索引选择》中提到,explain的输出,就是优化…