.Net中的自定义特性

来源:互联网 发布:windows 打印机 api 编辑:程序博客网 时间:2024/05/22 03:24
在.Net中可以在类或者类的属性上添加一些特性来标识这个类能拥有的功能.
比如常用到的 [Serializable] 就是用来标识对象可以被序列化的.

当然.我们也可以自己定义一些特性来提供一些功能的支持.

首先,我们需要定义一个特性,首先我们定义一个特性类,类名是 ______Attribute ,    ______是我们需要的特性的名字.
接下来我们用 sealed 修饰符把这个类设置为不可以被继承,并且继承 System.Attribute 类
然后用  [AttributeUsage(AttributeTargets.Property)]  特性把这个类注册为特性
下面就是最后一步了,编写自定义特性类的属性和构造方法.

下面是一个用作映射属性与数据库字段的特性类:

/// <summary>/// 将类的属性与数据库表中的列相关联。/// </summary>[AttributeUsage(AttributeTargets.Property)]public sealed class ColumnAttribute : System.Attribute{ /// <summary> /// 获取或设置列的名称。 /// </summary> public string ColumnName { get; private set; } /// <summary> /// 获取或设置列的类型。 /// </summary> public SqlDbType ColumnType { get; private set; } /// <summary> /// 初始化 MagicStar.Entity.ColumnAttribute 类的一个新实例。 /// </summary> /// <param name="columnCaption">表或视图的标题。</param> /// <param name="columnType">类型。</param> public ColumnAttribute(string columnName, SqlDbType columnType) { ColumnName = columnName; ColumnType = columnType; } /// <summary> /// 初始化 MagicStar.Entity.ColumnAttribute 类的一个新实例。 /// </summary> /// <param name="columnCaption">表或视图的标题。</param> /// <param name="columnName">表或视图的名称。</param> /// <param name="columnType">类型。</param> public ColumnAttribute(string columnName) { ColumnName = columnName; }}


特性的使用方式如下:

public class TestA{ [Column("TestName", SqlDbType.DateTime)] public string Col1{get;set;} [Column("TestValue")] public string Col2{get;set;}}


这样我们就在这些属性上标识好了特性了,那么我们应该怎么获得这些特性的值呢?  下面就是获取的方法

首先是如何遍历特性里面的值, 步骤如下:
1.首先获得对象中的属性
2.获得属性上标识的特性
3.获取特性中的值

知道要做什么之后就好办了, 那么我们怎么能拿到对象中的属性呢?
答案是 Type中的GetProperties()方法.
首先我们要通过 typeof()获取我们这个类的Type 
然后使用 GetProperties()获得类中的属性数组.

好,属性取到了.接下来要做的就是获取属性上标识的特性.
上面步骤中我们可以获得属性的对象,继续通过
GetCustomAttributes(true) 方法获得属性上所有的特性

下面只需要将 Object对象强转成我们自己定义的特性的类型就可以访问特性下定义的属性值了.


下面是一段我写的实现代码

foreach (System.Reflection.PropertyInfo property in typeof(TestA).GetProperties()){ object[] attributes = property.GetCustomAttributes(true); foreach (object attribute in attributes) { Console.WriteLine(((ColumnAttribute)attribute).ColumnName); Console.WriteLine(((ColumnAttribute)attribute).ColumnType); }}


这里是遍历获取所有的属性上的特性,那么我们怎么针对某一个属性来获取特性呢.
其实很简单,吧 GetProperties()方法换成 GetProperty() 就可以获取指定的属性了.

下面是具体代码

foreach (ColumnAttribute item in TestA.GetAttribute(typeof(TestA),"Col1")){ Console.WriteLine(item.ColumnName);}

 

http://xiachanghao1990.blog.163.com/blog/static/486960242012515102410527/

0 0
原创粉丝点击