.Net中的自定义特性
来源:互联网 发布:windows 打印机 api 编辑:程序博客网 时间:2024/05/22 03:24
比如常用到的 [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
然后使用
好,属性取到了.接下来要做的就是获取属性上标识的特性.
上面步骤中我们可以获得属性的对象,继续通过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/
- .Net中的自定义特性
- Attribute(二)——自定义特性+Asp.net MVC中的filter详解
- Attribute(二)——自定义特性+Asp.net MVC中的filter详解
- ADO.NET 中的 XML 特性
- ADO.NET 中的 XML 特性
- ADO.NET 中的 XML 特性
- 理解.NET中的Attribute(特性)
- ADO.NET 中的 XML 特性
- ADO.NET 中的 XML 特性
- .Net 中的反射(反射特性)
- .Net 中的反射(反射特性)
- .NET CORE 自定义特性的简单操作
- 2012.6.12 .net自定义xml序列化及自定义特性
- ASP.NET 2.0 中的SqlCacheDependency特性
- ASP.NET 2.0 中的SqlCacheDependency特性
- .Net 中的反射(反射特性) - Part.3
- .Net 中的反射(反射特性) - Part.3
- .Net 中的反射(反射特性) - Part.3
- Entity Framework中IQueryable, IEnumerable, IList的区别
- 我的第五课:jQuery 效果 - 隐藏和显示,切换
- 排列组合算法
- YII分页
- 数据库建外键时不可不注意的几点!!!
- .Net中的自定义特性
- android异步向服务器请求数据
- USACO--Section1.1--Broken Necklace
- Android 操作系统的内存回收机制
- .NET中二进制图片的存储与读取
- Java NIO原理和使用
- C++常见问题之一void&null&0
- 信管10级学生部分电子商务作业
- C++标准基金会推荐:在线C++编译器