首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 自訂屬性完整教學:設計、建立、讀取與實戰應用

     編輯:關於C#

什麼是自訂屬性?

屬性是編譯時期附加在型別、成員、參數等程式元素上的中繼資料。.NET 執行階段可透過反射讀取這些資訊,進而改變程式行為或提供額外功能。常見內建屬性如 [Obsolete]、[Serializable]、[WebMethod] 等。

設計自訂屬性的四大考量

  1. 目的:解決什麼問題?是否已有內建機制(如介面、基類)可替代?
  2. 資料:單純標記(如 [Hide])還是攜帶參數(如 [Alias("Name", "First")])?
  3. 部署:放在使用者組件、共用輕量組件,還是核心框架組件?
  4. 消費者:誰會讀取?是同組件還是外部工具(如序列化器、驗證框架)?

建立自訂屬性類別

繼承 System.Attribute,慣例命名以 Attribute 結尾:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class AliasAttribute : Attribute {
    public string[] Names { get; }
    public AliasAttribute(params string[] names) => Names = names;
}

public class HideAttribute : Attribute { } // 純標記,無建構函數參數

套用屬性

public class User {
    [Hide]
    public string SSN { get; set; }

    [Alias("FirstName", "First")]
    public string FName { get; set; }
}

透過反射讀取屬性


public static Dictionary<string, string> GetAliasMap(Type type) {
    var map = new Dictionary<string, string>();
    foreach (var prop in type.GetProperties()) {
        var attrs = prop.GetCustomAttributes<AliasAttribute>(inherit: true);
        foreach (var attr in attrs) {
            foreach (var name in attr.Names)
                map[name] = prop.Name;
        }
        map[prop.Name] = prop.Name; // 原名也映射
    }
    return map;
}

關鍵 API:MemberInfo.GetCustomAttributes<T>()、Attribute.GetCustomAttribute()。

實戰應用範例

  • Alias:跨物件屬性名稱映射(如 DTO ↔ 實體)
  • DisplayName:UI 顯示名稱覆寫
  • Examine:標記需深度檢視的屬性(如巢狀物件)
  • Hide:隱藏敏感欄位(如 SSN)

效能提示

  • 反射讀取屬性有開銷,建議快取結果(如 ConcurrentDictionary)
  • 避免在熱路徑頻繁呼叫 GetCustomAttributes
  • 考慮使用 System.ComponentModel.DataAnnotations 內建驗證屬性減少自訂需求
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved