对于.NET中反射这个词曾经无数次的听到过,但是因为项目的关系一直没有涉及到所以对它也就没有什么研究,刚巧最近的项目中涉及到这部分的东西,所以花了几天研究了一下,觉得这个功能真的很强大对于某些问题解决起来还真是比较方便更有些问题非要用它才能解决的了。
如果想把反射学好那还要先从Custom Attributes开始,这是什么东西?你可能已经见过了但是并不了解它,其实他就是这样一种标签:[FieldName("Hello,World!", Comments = "Good program")],呵呵眼熟吧!对了你可能在某个方法或属性或类上看到过类似的东西,那就是Custom Attributes,中文可以叫做“自定义属性”但是我真的不推荐这么叫它还是叫英文比较的贴切,你说那?好了下面开始进入正题了。
如何定义一个Custom Attribute
像上面的FiledName其实是我们自己定一个类,而且他必须继承自Attribut这个类。
上边的代码是不是很简单,这里要说明的是所有的Custom Attribute都要继承自System.Attribute这个类,只有这样C#编译器才允许你在代码中像这样([FieldName("Hello,World!", Comments = "Good program")])使用它。那么唯一我们不熟悉的东西就只有第一行代码了([AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=false)]),这个可要好好解释一下了,他很重要!!!实际上这行代码就是制订了这个Custom Attribute的使用规则,关键的东西就是AttributeUsage后面的3个参数,第一个参数用来限定了FieldName这个Custom Attribute可以使用在哪些元素上,上边的例子中AttributeTargets.Property表示FieldName只可以使用在某个类的属性上,当然AttributeTargets是个枚举其中定义了很多的元素,如:类、属性、方法、委托、时间、接口等等,详细的可以在使用时查询MSDN,有思想的人会有这样一个为题,现在FieldName只可以使用在属性上,要是我想让也可以使用在方法上怎么办那?很简单就是用“|”这个符号,注意是一个竖线不同于“||”,具体的写法可以这样:[AttributeUsage(AttributeTargets.Property | AttributeTargets.Method, AllowMultiple=false, Inherited=false)],现在FieldName就可以使用在属性和方法上了。现在第一个参数大家就明白了吧。给个小列子如下:
细心的读者就会发现FieldName的使用上又有所不同,是的。其实如果是构造函数的参数就直接给值,如果是属性的就要用<Property>=<Value>的语法,如果FieldName有一个无参数的构造函数就可以直接这样使用[FieldName],过多的详细的语法上的东西就不在说明了,在具体应用中自然就会知道了。
下面我们来看第二个参数AllowMultiple=false,其实很简单。就是说明FieldName是否可以对同一元素标示两次,AllowMultiple=false为不可以,即只可以对同一个元素标示一次;相反的AllowMultiple=true为可以,即可以对同一个元素标示多次,如果AllowMultiple=true,如下:
接下来看第三个参数Inherited=false,他的意思就是:在派生类中基类的标签是否在派生类中有效,如:如果类SubCustomAttribute继承了上面的类CustomAttribute,如果Inherited=true那么SubCustomAttribute所继承过来的Name属性的FieldName标签在派生类中同样有效,反之Inherited=false那么标签FieldName在SubCustomAttribute中就失效了!
好的,相信现在大家对怎样定义一个Custom Attribute都明白了,而且对[AttributeUsage(AttributeTargets.Property | AttributeTargets.Method, AllowMultiple=true, Inherited=false)]的含义也比较清楚啦,常用的知识基本上也就够用了,其实除了AttributeUsage之外还有两个特殊的标签,[assembly:SomeAssemblyAttribute(Parameters)]和[module:SomeAssemblyAttribute(Parameters)]这两个东西因为涉及到其他的知识这里先不做介绍,在后面的讲解中会详细说明。Custom Attribute就介绍完了,但是他有什么用那?怎样应用那?什么时候需要使用他那?我们带着这些问题来继续探讨更关键的东西,“反射”。