C# 中的 Type.GetCustomAttributes() 方法

17 Mar 2025 | 6 分钟阅读

本文将讨论 C# 中的 Type.GetCustomAttribures() 方法,包括其语法、参数和示例。

引言

在 C# 中,Type.GetCustomAttributes() 方法提供了一种可扩展的方式来获取与程序中类型相关的特定特性。自定义特性构成了程序员可以附加到各种程序元素(如字段、属性、方法和类)的元数据,以传达编程语言本身未定义的额外信息或行为。通过在运行时使用 Type.GetCustomAttributes() 动态检查这些特性,开发人员可以为程序提供适应性和灵活性。

Type.GetCustomAttributes() method in C#

要使用 Type.GetCustomAttributes() 方法,开发人员首先需要获取一个表示所需类型的 Type 对象。这通常是通过在实例上调用 GetType() 方法或简单地使用 typeof() 运算符来完成的。获取 Type 对象后,调用 GetCustomAttributes() 会返回一个对象数组,这些对象对应于最近添加到该类型的自定义特性。

之后,如果需要,可以检查、修改或应用这些特性来影响程序的逻辑。

Type.GetCustomAttributes() 方法签名中的一个参数决定了在执行特性搜索时是否应包含类型的继承链。第二个选项允许程序员通过传递 true 或 false 来个性化搜索行为以满足他们的特定需求。将此设置设置为 false 会将搜索限制在直接应用于类型本身的特性上,从而在不需要继承遍历的情况下提高效率。将其设置为 true 则会扩展搜索范围以包含继承的特性。

Type.GetCustomAttributes() 在许多实际应用中都很有用,包括序列化、依赖注入和运行时反射。

例如,开发人员可能会实现它来根据特性识别和设置组件,根据特性限制检查程序部分,或以各种格式记录包含唯一特性的对象。总而言之,该技术为开发人员提供了对内省更大的控制,从而实现了更令人兴奋和更具适应性的 C# 程序。

语法

它具有以下语法:

示例 1

让我们举一个例子来说明 C# 中的 Type.GetCustomAttributes() 方法。

输出

Custom Attribute Message: This is a custom attribute

说明

自定义参数的定义(MyCustomAttribute)

通过从 Attribute 派生,我们开发了一个名为 MyCustomAttribute 的自定义特性。类(AttributeTargets.Class)可以使用此特性。与特性相关的信息可以由一个名为 message 的字符串参数表示,该参数由特性构造函数处理。

使用自定义特性

通过在类声明前面放置 [MyCustom("This is a custom attribute")],我们将 MyCustomAttribute 应用于 MyClass 类。在本例中,消息“This is a custom attribute”被提供给特性构造函数。

主方法

在 main() 函数中,程序入口点代表它们开始的地方。

排序和获取

我们使用 typeof(MyClass) 来获取一个表示 MyClass 类型的 Type 对象。因此,我们可以使用反射在运行时操作 MyClass 类型。

检索特性

我们在 Kind 对象(type)中调用 GetCustomAttributes() 函数来获取应用于 MyClass 类型的自定义特性的数组。根据 false 参数,他们不希望开始在继承树中搜索特性。

重复和呈现

我们使用一个函数循环来遍历 attributes 数组。

使用模式匹配,我们在循环中确定每个属性(对应于 MyCustomAttribute 类型)是否存在。

为了显示相关消息,我们将属性转换为 MyCustomAttribute 类型,并在其对应该类型时访问其 Message 属性。

结果

程序输出显示了与包含在 MyClass 类中的 MyCustomAttribute 相关的消息。此代码说明了如何使用 Type 来定义、应用和接收自定义特性。

Type.GetCustomAttributes() 方法的用途

我们可以使用 Type.GetCustomAttributes() 函数来获取 C# 中特定类型的自定义特性。通过使用自定义特性,我们可以为代码的类型、技术、特性和其他元素添加行为或元数据。以下是一些 Type.GetCustomAttributes() 的典型应用:

  1. 反射:在反射的上下文中,GetCustomAttributes() 允许个人在运行时动态检查类型。需要评估类型或编写适应不同特性的通用编程的框架和库可以从中受益。
  2. 注释和信息:可以通过自定义特性向类型附加额外信息。例如,可以使用特性来建立类型的数据库映射、验证规则或序列化行为。
  3. 运行时行为:我们应用程序的代码在运行时的方式可以受到自定义特性的影响。例如,我们可以创建一个自定义特性来控制授权权限,或者仅将特定类型指示为 “单例”
  4. 代码生成:代码生成工具也可以使用特性作为标记。可以编写自定义工具与反射结合使用,以检查您的代码,从而根据特定特性的存在或缺失生成额外的代码。

示例 2

输出

Description: This is a custom attribute

说明

首先,软件通过一个名为 MyCustomAttribute 的自定义特性进行了建立。此特性的构造函数,它派生自 Attribute 类,需要一个字符串参数来配置 Description 值。这些类型的自定义属性通常用于为 C# 程序中的类型提供额外的行为或元数据。

接下来,使用 [MyCustom("This is a custom attribute")] 语法将自定义特性应用于名为 MyClass 的类。此参数允许我们将给定的描述与 MyClass 类相关联。

在 Main 函数中,应用程序使用反射来检查 MyClass 类型。通过利用 Type.GetCustomAttributes() 函数,它获取了先前分配给 MyClass 的自定义特性的数组。

应用程序通过将 typeof(MyCustomAttribute) 作为参数传递给应用程序,将它接收的属性信息限制为仅包含 MyCustomAttribute 的实例。

之后,软件循环遍历 attributes 数组的元素,验证其中每一个都是 MyCustomAttribute 类型。在这种情况下,它通过将属性转换为 MyCustomAttribute 来检索 Description 属性。控制台随后显示以下解释。

最终,在程序执行后,将输出附加到 MyClass 的自定义特性中找到的描述——在本例中为“This is a custom attribute”。

总而言之,该程序展示了如何使用反射通过类型参数在运行时收集特性信息,以及如何在 C# 中开发和使用自定义特性来使用附加元数据注释类型。

结论

总而言之,C# 中的 Type.GetCustomAttributes() 函数提供了一个强大的工具,用于检查类型以确定已添加到其中的自定义特性。它还使得在运行时以编程方式分析类型的元数据和行为成为可能,这有助于代码生成、元数据驱动编程、基于反射的框架和运行时行为定制等多种场景。

开发人员可以通过利用 Type.GetCustomAttributes() 来编写更具可扩展性和动态性的代码,这些代码可以响应特定特性的存在或缺失。无论是否用于根据特性标记生成代码、使用附加元数据注释类型,还是管理运行时行为,上述方法对于实现 C# 程序中自定义特性的全部潜力都至关重要。