- C#特性
- 1. 概括
- 2. 語法
- 定義特性類
- 應用特性
- 獲取特性
- 3. 應用場景
- 資料驗證
- 序列化和反序列化
- 描述性後設資料
- 依賴注入
- 單元測試
- 許可權控制
- AOP(面向切面程式設計)
- 總結
- 引用
C#特性
1. 概括
C#中的特性是一種用於向程式碼元素新增後設資料的機制。它們允許程式設計師在程式碼中新增額外的資訊,以影響程式的行為、編譯過程或提供其他後設資料。特性在編寫現代C#程式碼時變得越來越常見,因為它們提供了一種優雅的方法來實現後設資料驅動的開發。
特性分為:框架自帶特性(如:[Required]、[Authorize]、[Route]、[HttpPost]等)和自定義特性,都繼承System.Attribute
2. 語法
定義特性類
以下是一個簡單的特性類定義示例:
using System;
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public class MyCustomAttribute : Attribute
{
public string Description { get; }
public MyCustomAttribute(string description)
{
Description = description;
}
}
應用特性
將特性應用到程式碼元素上,可以使用以下語法:
[MyCustom("類使用自定義特性")]
public class MyClass
{
[MyCustom("方法使用自定義特性")]
public void MyMethod()
{
}
}
獲取特性
要獲取 MyCustom 特性,您可以使用反射來檢查某個型別或成員上是否應用了該特性,並且訪問該特性的屬性。下面是如何獲取 MyCustom 特性的示例程式碼:
// 獲取 MyClass 類上的 MyCustom 特性
var classAttributes = typeof(MyClass).GetCustomAttributes(typeof(MyCustomAttribute), false);
foreach (MyCustomAttribute attribute in classAttributes)
{
Console.WriteLine($"MyClass類使用的MyCustom特性: {attribute.Description}");
}
// 獲取 MyClass 類中 MyMethod 方法上的 MyCustom 特性
var methodInfo = typeof(MyClass).GetMethod("MyMethod");
var methodAttributes = methodInfo.GetCustomAttributes(typeof(MyCustomAttribute), false);
foreach (MyCustomAttribute attribute in methodAttributes)
{
Console.WriteLine($"MyMethod方法使用的MyCustom特性: {attribute.Description}");
}
3. 應用場景
資料驗證
在模型類上應用特性,以進行資料驗證。例如,使用DataAnnotations
中的特性來驗證模型:
public class User
{
[Required]
[StringLength(50)]
public string Name { get; set; }
[Range(18, 99)]
public int Age { get; set; }
}
序列化和反序列化
控制物件的序列化和反序列化過程。例如,使用Json.NET中的特性來指定JSON屬性的名稱和行為:
public class Product
{
[JsonProperty("product_name")]
public string Name { get; set; }
[JsonIgnore]
public decimal Price { get; set; }
}
描述性後設資料
為列舉值或其他程式碼元素新增描述資訊。例如,使用DescriptionAttribute
為列舉值新增描述資訊:
public enum Status
{
[Description("The task is pending")]
Pending,
[Description("The task is completed")]
Completed
}
依賴注入
在依賴注入容器中標記服務以進行注入。例如,在ASP.NET Core中,使用[Inject]
特性標記需要注入的服務:
[Inject]
public class MyService
{
// This property will be injected by the DI container
}
單元測試
在單元測試框架中使用特性標記測試方法。例如,在NUnit中使用[Test]
特性標記測試方法:
[Test]
public void TestMethod()
{
// Test code here
}
許可權控制
使用特性進行許可權控制。例如,在ASP.NET Core中使用[Authorize]
特性標記需要授權的控制器或操作方法:
[Authorize(Roles = "Admin")]
public class AdminController : Controller
{
// Only accessible to users in the Admin role
}
AOP(面向切面程式設計)
透過特性實現AOP,如日誌記錄、事務管理等。例如,在ASP.NET Core中使用ActionFilterAttribute
來實現日誌記錄:
public class LogActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
// Log action execution start
base.OnActionExecuting(context);
}
public override void OnActionExecuted(ActionExecutedContext context)
{
// Log action execution end
base.OnActionExecuted(context);
}
}
總結
C#中的特性為程式設計師提供了一種強大的後設資料驅動機制,可以應用於多種場景。透過在程式碼中定義和使用特性,可以增強程式碼的可讀性、可維護性,並提供靈活的方式來控制程式的行為和屬性。
引用
- 博文示例程式碼 https://github.com/chi8708/DotNetNote/blob/master/Note.Basic/11Attribute.cs