前言
C# 的Attribute(特性)用法
一、C#- Attribute(特性)是什么?
特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。
特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。
.Net 框架提供了两种类型的特性:预定义特性和自定义特性。
二、预定义特性
预定义的特性可以用来为代码添加元数据和指示编译器和运行时执行特定的操作。同时可以增加代码的功能和可读性。
以下是一些常见的 .NET 预定义特性:
- [Serializable] 特性:用于标记一个类或结构体可序列化,并可以在网络上传输或保存到磁盘上。
[Serializable]
public class MyClass
{
// ...
}
- [Obsolete] 特性:用于标记一个方法、属性或类已经过时,并提供相应的替代方案或建议。下面设置为true是启动报错。默认为false。
[Obsolete("This method is deprecated. Use NewMethod instead.", true)]
public void OldMethod()
{
// ...
}
- [Conditional] 特性:用于指定一个方法只有在满足特定条件编译指令时才会被编译。例如:下方代码⬇️ #define DEBUG 与 [Conditional(“DEBUG”)] 配合使用。
// #define DEBUG
[Conditional("DEBUG")]
public void DebugMethod()
{
// This method will only be included in the build if the DEBUG symbol is defined
// ...
}
- [DllImport] 特性:用于指示在托管代码中引用一个非托管函数的定义。
[DllImport("user32.dll")]
public static extern int MessageBox(int hWnd, string text, string caption, int options);
-
[DataContract] 特性:用于指定一个类可以被序列化,并且可以控制序列化的方式。
-
[DataMember] 特性:用于指定一个属性或字段可以被序列化。
-
[WebMethod] 特性:用于标记一个方法可以被远程调用。
-
[Route] 特性:用于指定路由规则,定义 ASP.NET MVC 中的路由。
-
[HttpPost]、[HttpGet]、[HttpPut]、[HttpDelete] 特性:用于指定一个方法可以处理响应的 HTTP 请求类型。
-
[Authorize] 特性:用于标记一个方法或控制器需要进行授权才能访问。
二、自定义特性
C#中的自定义特性允许我们在代码中添加元数据,以提供有关程序元素(类、方法、属性等)的额外信息。下面是详细的步骤来创建并使用自定义特性。
-
声明自定义特性:
自定义特性需要继承System.Attribute
类并添加AttributeUsage
特性。AttributeUsage
特性用于指定特性可以应用的目标(类、方法、属性等)以及特性的使用方式(一次性或多次性)。例如,我们可以创建一个自定义特性
CustomAttribute
,如下所示:[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] public class CustomAttribute : Attribute { // 添加自定义属性和方法 public string Name { get; set; } public int Age { get; set; } // 构造函数 public CustomAttribute(string name, int age) { Name = name; Age = age; } }
-
构建自定义特性:
在自定义特性中,我们可以添加一些属性和构造函数以提供需要的元数据。在上面的示例中,我们添加了Name
和Age
属性,并定义了一个带有两个参数的构造函数。 -
在目标程序元素上应用自定义特性:
为了在目标程序元素上应用自定义特性,我们可以使用方括号[]
来将特性应用于类、方法、属性等。在方括号内,我们可以提供自定义特性的参数,就像在实例化类时提供构造函数参数一样。[Custom("John", 30)] public class MyClass { [Custom("Method 1", 25)] [Custom("Method 2", 40)] public void MyMethod() { // 方法实现逻辑 } }
在上面的示例中,我们将
Custom
特性应用于MyClass
类和MyMethod
方法,并为每个特性提供相应的参数。 -
通过反射访问特性:
我们可以使用反射来获取应用于程序元素的自定义特性,并访问特性的属性和方法。var type = typeof(MyClass); var classAttributes = type.GetCustomAttributes(typeof(CustomAttribute), true); foreach (var attribute in classAttributes) { var customAttribute = (CustomAttribute)attribute; Console.WriteLine($"Name: {customAttribute.Name}, Age: {customAttribute.Age}"); } var method = type.GetMethod("MyMethod"); var methodAttributes = method.GetCustomAttributes(typeof(CustomAttribute), true); foreach (var attribute in methodAttributes) { var customAttribute = (CustomAttribute)attribute; Console.WriteLine($"Name: {customAttribute.Name}, Age: {customAttribute.Age}"); }
在上面的示例中,我们首先通过
typeof
操作符获取MyClass
的类型,然后使用GetCustomAttributes
方法获取应用于类的特性。同样,我们通过反射获取MyMethod
方法,并获取应用于该方法的特性。最后,我们可以访问特性的属性和方法。请注意,我们可以将
typeof
和GetMethod
方法的参数替换为其他目标程序元素(如属性或字段),以获取应用于该元素的特性。
总结
以上就是今天要讲的内容,本文简单介绍了的C# Attribute(特性)使用,预定义特性与自定义特性。