C#特性

Aigu發表於2024-05-19

目錄
  • 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#中的特性為程式設計師提供了一種強大的後設資料驅動機制,可以應用於多種場景。透過在程式碼中定義和使用特性,可以增強程式碼的可讀性、可維護性,並提供靈活的方式來控制程式的行為和屬性。

引用

  1. 博文示例程式碼 https://github.com/chi8708/DotNetNote/blob/master/Note.Basic/11Attribute.cs

相關文章