码迷,mamicode.com
首页 > 其他好文 > 详细

特性(摘要)

时间:2015-10-15 23:44:20      阅读:321      评论:0      收藏:0      [点我收藏+]

标签:

特性(摘要)

特性(attribute),让我们可以为代码标记一些信息,而这样的信息又可以从外部读取,并通过各种方式来影响我们所定义的类型的使用方式。这种手段通常被称为对代码进行“装饰(decorating)”。

举例来说,比如我们要创建的某个类包含了一个极其简单的方法(简单到我们不必去理会他)。但在应用程序调试期间,可能还是不得不通过代码的逐行检查而调试它。在这种情况下,我们就可以对该方法添加一个特性,告诉VS在调试时不要进入该方法进行逐句调试,而是应该跳过该方法直接调试下一条语句。这样的特性申明方式如下:

[DebuggerStepThrough]
public void DullMethod()
{
    ...
}

上述代码中所包含的特性就是[DebuggerStepThrough]。所有特性的添加方式都是如此,也就是说只需将特性名称用方括号括起来,并写在要应用的目标代码前面即可。并且可以为一段代码添加多个特性,将这些特性用(,)分隔开,或者用多个方括号括起来每一个均可

上述代码中所使用的特性实际上是通过DebuggerStepThroughAttribute这个类来实现的,而这个类位于System.Diagnostics名称空间中,因此如果我们要使用上面那个特性,就必须使用using 语句来引用这一名称空间。引用该特性既可以直接使用其完整名称,也可以像前面的代码那样,去掉后缀Attribute。

通过上述方式添加特性后,编译器就会创建该特性类的一个实例,然后将其与类方法关联起来。某些特性可以通过构造函数的参数或属性进行自定义,并在添加特性的时候进行指定,例如:

[DoesInterstingThings(1000,WhatDoesItDo="voodo")]
public class DecoratedClass
{
    ...
}

上述特性的值1000传递给了DoesInterestingThingsAttribute的构造函数,并将WhatDoesItDo属性的值设置为字符串"voodoo"。

 

读取特性:

要读取特性,我么必须使用一种称为“反射(reflection)“的技术。这种非常高级的技术让我们可以在运行的时候动态检查类型的信息,甚至是在创建对象的位置,或者在不必知道具体对象的情况下调用某个方法。

简单来说,反射可以获取保存在Type对象中的信息,以及通过System.Reflection名称空间中的类型来获取不同的类型信息。在此之前,我们已经通过typeof运算符从类中快速的获取类型信息,以及使用GetType()方法从对象实例中获取信息的方法。通过反射技术,我们可以继续从Type对象获取成员信息。基于这个方法,我们就可以从类或类的不同成员中获取特性信息了。

为此,最简单的方法也就是通过Type.GetCustomAttribute()方法来实现。这个方法最多使用两个参数,然后返回一个包含一系列object实例的数组,每个实例都是一个特性实例。第一个参数是可选的,即传递我们感兴趣的类型或若干特性的类型(其他所有特性均会被忽略)。如果不使用这一参数,将返回所有特性。第二个参数是必须的,即通过一个布尔值来指示,只想了解类本身的信息,还是除了该类之外还希望了解派生类得的所有类

例如,下面的代码可以列出DecoratedClass这个类的所有特性:

Type classType = typeof(DecoratedClass);
object[] customAttributes = classType.GetCustomAttribute(true);
foreach(object customAttribute in customAttributes)
{
    Console.WriteLine("Attribute of type {0} found.",customAttribute);
}

通过这种方法了解了不同特性之后,我们就可以为不同的特性采取不同的操作了。这也正是当VS遇到前面介绍的DebuggerStepThroughAttribute特性时所采取的操作。

特性(摘要)

标签:

原文地址:http://www.cnblogs.com/SilentCode/p/4883944.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!