定制特性和反射

(一)定制特性

定制特性可以直接影响代码的运行方式

.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类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值