.net使用自定義類屬性實(shí)例

字號(hào):


    一般來說,在.net中可以使用Type.GetCustomAttributes獲取類上的自定義屬性,可以使用PropertyInfo.GetCustomAttributes獲取屬性信息上的自定義屬性。
    下面以定義一個(gè)簡(jiǎn)單數(shù)據(jù)庫(kù)表的映射實(shí)體類來說明相關(guān)的使用方法,基于自定義類屬性和自定義類中的屬性的自定義屬性,可以方便的進(jìn)行類標(biāo)記和類中屬性的標(biāo)記
    創(chuàng)建一個(gè)類的自定義屬性,用于標(biāo)識(shí)數(shù)據(jù)庫(kù)中的表名稱,需要繼承自Attribute類:
    代碼如下:
    [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
    public sealed class TableAttribute : Attribute
    {
    private readonly string _TableName = "";
    public TableAttribute(string tableName)
    {
    this._TableName = tableName;
    }
    public string TableName
    {
    get { return this._TableName; }
    }
    }
    創(chuàng)建一個(gè)屬性的自定義屬性,用于標(biāo)識(shí)數(shù)據(jù)庫(kù)表中字段的名稱,需要繼承自Attribute類:
    代碼如下:
    [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
    public class FieldAttribute : Attribute
    {
    private readonly string _FieldName = ""; ///數(shù)據(jù)庫(kù)的字段名稱
    private System.Data.DbType _Type = System.Data.DbType.String; ///數(shù)據(jù)庫(kù)的字段類型
    public FieldAttribute(string fieldName)
    {
    this._FieldName=fieldName;
    }
    public FieldAttribute(string fieldName,System.Data.DbType type)
    {
    this._FieldName=fieldName;
    this._Type=type;
    }
    public string FieldName
    {
    get { return this._FieldName; }
    }
    public System.Data.DbType Type
    {
    get{return this._Type;}
    }
    }
    創(chuàng)建一個(gè)數(shù)據(jù)實(shí)體基類:
    代碼如下:
    public class BaseEntity
    {
    public BaseEntity()
    {
    }
    /// <summary>
    /// 獲取表名稱
    /// </summary>
    /// <returns></returns>
    public string GetTableName()
    {
    Type type = this.GetType();
    object[] objs = type.GetCustomAttributes(typeof(TableAttribute), true);
    if (objs.Length <= 0)
    {
    throw new Exception("實(shí)體類沒有標(biāo)識(shí)TableAttribute屬性");
    }
    else
    {
    object obj = objs[0];
    TableAttribute ta = (TableAttribute)obj;
    return ta.TableName; //獲取表名稱
    }
    }
    /// <summary>
    /// 獲取數(shù)據(jù)實(shí)體類上的FieldAttribute
    /// </summary>
    /// <param name="propertyName"></param>
    /// <returns></returns>
    public FieldAttribute GetFieldAttribute(string propertyName)
    {
    PropertyInfo field = this.GetType().GetProperty(propertyName);
    if (field == null)
    {
    throw new Exception("屬性名" + propertyName + "不存在");
    }
    object[] objs = field.GetCustomAttributes(typeof(FieldAttribute), true);
    if (objs.Length <= 0)
    {
    throw new Exception("類體屬性名" + propertyName + "沒有標(biāo)識(shí)FieldAttribute屬性");
    }
    else
    {
    object obj = objs[0];
    FieldAttribute fieldAttribute=(FieldAttribute)obj;
    fieldAttribute.FieldValue=field.GetValue(this,null);
    return fieldAttribute;
    }
    }
    }
    創(chuàng)建數(shù)據(jù)實(shí)體:
    代碼如下:
    [Table("Wincms_Dictionary")] ///映射到數(shù)據(jù)庫(kù)的Wincms_Dictionary表
    public class Wincms_Dictionary : BaseEntity
    {
    private int _DictionaryId;
    public Wincms_Dictionary()
    {
    }
    [Field("DictionaryId",DbType.Int32)] ///映射到數(shù)據(jù)庫(kù)的Wincms_Dictionary表中的字段
    public int DictionaryId
    {
    get { return this._DictionaryId; }
    set
    {
    this._DictionaryId = value;
    }
    }
    }
    ///基于實(shí)體類獲取實(shí)體對(duì)應(yīng)的表名稱和字段名稱
    public class Test
    {
    public static void main(string[] args)
    {
    Wincms_Dictionary dict=new Wincms_Dictionary();
    Console.WriteLine("表名稱:"+GetTableName(dict));
    Console.WriteLine("字段名稱:"+GetFieldName(dict,"DictionaryId"));
    Console.Read();
    }
    ///獲取實(shí)體表名稱
    public static string GetTableName(BaseEntity entity)
    {
    return entity.GetTableName();
    }
    ///獲取實(shí)體字段名稱
    public static string GetFieldName(BaseEntity entity,string propertyName)
    {
    FieldAttribute fieldAttribute=entity.GetFieldAttribute(propertyName);
    return fieldAttribute.FieldName;
    }
    }
    輸出結(jié)果為:
    代碼如下:
    表名稱:Wincms_Dictionary
    字段名稱:DictionaryId