(一)定制特性
定制特性可以直接影响代码的运行方式
.Net 允许用户在各个数据项上定义特性,也允许用户定义自己的特性.这些特性不会影响编译过程,编译器不能识别他们,但这些特性在应用于程序元素时,可以在编译好的程序集中用作元数据.并通过反射读取他们,使它们在运行时做出决策.即定制特性可以直接影响代码的运行方式.
编译器遇见特性时的处理
[FieldName("SocialSecurityNumber")]
public string SocialSecurityNumber
{
//...
}
编译器发现这个属性有一个特性FieldName时,首先将Attribute添加到这个名称后形成FieldNameAttribute.(如果特性结尾已经有Attribute时这不再添加).然后搜索路径的所有命名空间直至找到FieldNameAttribute的类.这个类继承自Attribute.
特性类的编写
[AttributeUsage(AttributeTargets.Property|AttributeTargets.Methods,
AllowMultiple = false,
Inherited = false)]
public class FieldNameAttribute:Attribute
{
//...
}
1.AttributeUsage特性
特性类本身用一个System.AttributeUsage特性(AttributeUsage更像是一个元特性.不仅可以用于其他类上还可以用于其他特性上)
主要表示定制特性主要可以应用于哪些类型的程序元素上.这些信息由第一个属性提供是必选的。通过AttributeTargets枚举提供。
注意:Assembly和Module不属于任何程序元素.它们的特性可以放在源代码的任何地方.但需要assembly或module作前缀
[assembly:SomeAssemblyAttribute(Parameters)]
[module:SomeAssemblyAttribute(Parameters)]
2.AllowMultiple
表示一个特性可以多次应用到用一项上
3.Inherited
表示特性应用到类或接口上时也可以应用到所有派生的类或接口上.
4.指定特性的的可选参数
[FiledName("SocialSecurityNumber",Comment="This is the primary key field")]
public string SocialSecurtyNumber
{
//...
}
[AttributeUsage(AttributeTargets.Property|AttributeTargets.Methods,
AllowMultiple = false,
Inherited = false)]
public class SocialSecurtyNumber:Attribute
{
private string comment
public string Comment
{
get{return comment;}
set{comment = value;}
}
}
(二)反射
1.System.Type类
2.Assenbly类