特性机制可以帮助程序员以申明的方式进行编程,而不再需要考虑实现的细节。
4.1 神马是特性?如何自定义一个特性?
(1)特性是什么?
特性是一种有别于普通命令式编程的编程方式,通常被称为申明式编程方式。所谓申明式编程方式就是指程序员只需要申明某个模块会有怎样的特性,而无需关心如何去实现。下面的代码就是特性在ASP.NET MVC中的基本使用方式:
[HttpPost] public ActionResult Add(UserInfo userInfo) { if (ModelState.IsValid) { // To do fun } return RedirectToAction("Index"); }
当一个特性被添加到某个元素上时,该元素就被认为具有了这个特性所代表的功能或性质,例如上述代码中Add方法在添加了HttpPost特性之后,就被认为只有遇到以POST的方式请求该方法时才会被执行。
Note:特性在被编译器编译时,和传统的命令式代码不同,它会被以二进制数据的方式写入模块文件的元数据之中,而在运行时再被解读使用。特性也是经常被反射机制应用的元素,因为它本身是以元数据的形式存放的。
(2)如何自定义特性
除了直接使用.NET中内建的所有特性之外,我们也可以建立自己的特性来实现业务逻辑。在上面反射工厂的实现中就使用到了自定义特性。具体来说,定义一个特性的本质就是定义一个继承自System.Attribute类的类型,这样的类型就被编译器认为是一个特性类型。
下面我们看看如何自顶一个特性并使用该特性:
①定义一个继承自System.Attribute的类型MyCustomAttribute
/// <summary> /// 一个自定义特性MyCustomAttribute /// </summary> [AttributeUsage(AttributeTargets.Class)] public class MyCustomAttribute : Attribute { private string className; public MyCustomAttribute(string className) { this.className = className; } // 一个只读属性ClassName public string ClassName { get { return className; } } }