.net使用自定义类属性实例
一般来说,在.net中可以使用Type.GetCustomAttributes获取类上的自定义属性,可以使用PropertyInfo.GetCustomAttributes获取属性信息上的自定义属性。
下面以定义一个简单数据库表的映射实体类来说明相关的使用方法,基于自定义类属性和自定义类中的属性的自定义属性,可以方便的进行类标记和类中属性的标记
创建一个类的自定义属性,用于标识数据库中的表名称,需要继承自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; } } }
创建一个属性的自定义属性,用于标识数据库表中字段的名称,需要继承自Attribute类:
代码如下:
[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)] public class FieldAttribute : Attribute { private readonly string _FieldName = ""; ///数据库的字段名称 private System.Data.DbType _Type = System.Data.DbType.String; ///数据库的字段类型 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;} } }
创建一个数据实体基类:
代码如下:
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("实体类没有标识TableAttribute属性"); } else { object obj = objs[0]; TableAttribute ta = (TableAttribute)obj; return ta.TableName; //获取表名称 } } /// <summary> /// 获取数据实体类上的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 + "没有标识FieldAttribute属性"); } else { object obj = objs[0]; FieldAttribute fieldAttribute=(FieldAttribute)obj; fieldAttribute.FieldValue=field.GetValue(this,null); return fieldAttribute; } } }
创建数据实体:
代码如下:
[Table("Wincms_Dictionary")] ///映射到数据库的Wincms_Dictionary表 public class Wincms_Dictionary : BaseEntity { private int _DictionaryId; public Wincms_Dictionary() { } [Field("DictionaryId",DbType.Int32)] ///映射到数据库的Wincms_Dictionary表中的字段 public int DictionaryId { get { return this._DictionaryId; } set { this._DictionaryId = value; } } } ///基于实体类获取实体对应的表名称和字段名称 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(); } ///获取实体表名称 public static string GetTableName(BaseEntity entity) { return entity.GetTableName(); } ///获取实体字段名称 public static string GetFieldName(BaseEntity entity,string propertyName) { FieldAttribute fieldAttribute=entity.GetFieldAttribute(propertyName); return fieldAttribute.FieldName; } }
输出结果为:
代码如下:
表名称:Wincms_Dictionary 字段名称:DictionaryId
希望本文所述对大家的.net程序设计有所帮助。
相关推荐
STPace 2020-05-25
tthappyer 2020-01-17
yezi 2019-11-04
Imfondof 2015-06-15
JavaJspSsh 2019-09-08
wysjwh 2019-09-06
wangnantjobj 2019-07-01
cohciz 2019-07-01
攻城师 2019-06-29
gaohongijj 2016-08-01
Misswangdapao 2016-07-16
impress 2019-06-28
wcssdu 2019-06-28
notepaper 2016-04-07
wenhuadream 2015-03-26
瞌睡虫 2011-03-20
selt 2014-08-14