1. 程式人生 > >C#中自定義屬性的例子

C#中自定義屬性的例子



自定義屬性的作用

有時候我們需要給一個類或者類中的成員加上一些屬性或者附加資訊,讓類或者變數的功能更明確可控制的細粒度更高,打個簡單的比方:資料庫裡面的一張表,表中的每一個欄位都有很多屬性,如是否主鍵,預設值,註釋資訊等等,我們在編寫實體類的時候,如何表示這些資訊呢?通過自定義屬性可以實現。

自定義屬性的實現步驟

1、宣告一個類,並將 AttributeUsageAttribute 屬性應用到該類中。類的名稱即為新屬性的名稱
2、宣告該類從 System.Attribute 繼承:
3、定義 Private 欄位來儲存屬性值:
4、需要時,請為屬性建立建構函式:
5、為屬性 (Attribute) 定義方法、欄位和屬性 (Property):

屬性類(和相關列舉)

/// <summary>
    /// 資料庫欄位的用途。
    /// </summary>
    public enum EnumDBFieldUsage
    {
        /// <summary>
        /// 未定義。
        /// </summary>
        None = 0x00,
        /// <summary>
        /// 用於主鍵。
        /// </summary>
        PrimaryKey = 0x01,
        /// <summary>
        /// 用於唯一鍵。
        /// </summary>
        UniqueKey = 0x02,
        /// <summary>
        /// 由系統控制該欄位的值。
        /// </summary>
        BySystem = 0x04
    }
    [AttributeUsage(AttributeTargets.Property, Inherited = true)]
    public class DBFieldAttribute:Attribute
    {
        EnumDBFieldUsage m_usage;
        string m_strFieldName;
        string m_strDescription;
        object m_defaultValue;
        public DBFieldAttribute(string strFieldName,object defaultValue,
                                EnumDBFieldUsage usage,string strDescription)
        {
            m_strFieldName = strFieldName;
            m_defaultValue = defaultValue;
            m_usage = usage;
            m_strDescription = strDescription;
        }
        public DBFieldAttribute(string fieldName) : 
		this(fieldName,null, EnumDBFieldUsage.None,null)
        { }
        public DBFieldAttribute(string fieldName, EnumDBFieldUsage usage) : 
		this(fieldName, null,usage, null)
        { }

        // 獲取該成員對映的資料庫欄位名稱。
        public string FieldName
        {
            get
            {
                return m_strFieldName;
            }
            set
            {
                m_strFieldName = value;
            }
        }
        // 獲取該欄位的預設值
        public object DefaultValue
        {
            get
            {
                return m_defaultValue;
            }
            set 
            {
                m_defaultValue = value;
            }
        }
    }

此程式碼說明了如何製作自定義屬性類。其實跟一般的類的區別就是此類繼承自Attribute,加上AttributeUsage是屬性上的屬性,是可選的。

資料訪問層實體類:

class DalObj
    {
        string m_strTableName;
        int m_nID;
        string m_strName;
        string m_password;
        public DalObj(string strTableName)
        {
            m_strTableName = strTableName;
        }
        [DBField("id",EnumDBFieldUsage.PrimaryKey)]
        public int ID
        {
            get { return m_nID; }
            set { m_nID = value; }
        }
        [DBField("name",DefaultValue="遊客")]
        public string Name
        {
            get { return m_strName; }
            set { m_strName = value; }
        }
        [DBField("pwd")]
        public string PassWord
        {
            get { return m_password; }
            set { m_password = value; }
        }
    }

此程式碼說明了如何使用自定義的屬性。有兩點需要注意的地方

第一:類名可以跟自定義的類名一樣,也可以加上或減去後面的Attribute,本例子中就是使用的時候跟自定義的類名減少了“Attribute”。

第二:屬性引數填寫方法,如果自定義屬性類(例子中DBFieldAttribute)自己的建構函式帶引數,那麼這些引數是必選的,可以過載建構函式以滿足不同組合,必選引數填完之後,可以繼續給自定義屬性類中的公共成員帶命名地賦值,如例子中的DefaultValue="遊客" 一句就是命名引數。

遍歷自定義屬性的程式碼:

DalObj dalObj = new DalObj("users");
            StringBuilder sb = new StringBuilder();
            foreach (PropertyInfo proInfo in dalObj.GetType().GetProperties())
            {
                object[] attrs = proInfo.GetCustomAttributes(typeof(DBFieldAttribute), true);
              if (attrs.Length == 1)
              {
                  DBFieldAttribute attr = (DBFieldAttribute)attrs[0];
                  sb.Append(attr.FieldName + ":" + (attr.DefaultValue == null ? "null" : attr.DefaultValue.ToString()) + "\r\n");
              }
            }
            MessageBox.Show(sb.ToString());

此程式碼說明了如何檢索自定義屬性的值,主要用到了GetCustomAttributes來獲取屬性值。

轉載自:http://www.cnblogs.com/tuyile006/archive/2008/10/05/1304041.html