登山-C#-自定义特性

来源:互联网 发布:雅思是什么 知乎 编辑:程序博客网 时间:2024/05/22 01:49
自定义特性的格式

[FieldName(“SocialSecurityNumber”)]//等价于[FieldNameAttribute(“SocialSecurityNumber”)]

publicstring SocialSecurityNumber

{

get{

//etc.

自定义特性格式的组成部分

1.自定义特性放置在[]-中括号之中。

2.自定义特性对应的名称FieldName

3.可以指定特性的参数。

c#编译器发现SocialSecurityNumber这个属性应用了一个FieldName特性时

1.Attribute追加到FieldName这个名称的后面。形成FieldNameAttribute组合名称。

2.在名称空间中搜索有指定名称FieldNameAttribute的类。

倘若特性的名称以字符串Atrribute结尾,编译器就不会再去追加此字段了。


在编写特性类时,要指定

  • 特性可以应用到哪些类型的程序元素上(类,结构,属性和发放等),由AttributeTargets决定

  • 它是否可以多次应用到同一个程序元素上,由AllowMultiple决定

  • 特性应用在类和接口上时,是否可以由派生类和接口继承,由Inherited决定

  • 这个特性有哪些必选和可选参数,由类中的定义决定

[AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=false)]public class FieldNameAttribute:Attribute{private string name;public FieldNameAttribute(string name){this.name = name;}private string comment;public string Comment{get{return comment;}set{comment = value;}}}

使用如上特性

[FieldName(“SocialSecurityNumber”,Comment=”Thisis the primary key field”)]

当我们在程序中需要获得这些特性时,需要了解如下信息

Assembly类,在System.Reflection名称空间中定义,它允许访问给定程序集的元数据,也包含了可以加载和执行程序集的方法。Assembly.Load()Assembly.LoadFrom()的区别为Load()方法参数是程序集名称,运行库会在各个位置上搜索该程序集,这些位置包括本地目录和全局程序集缓存。LoadFrom()方法参数是程序集的完整路径名,他不会搜索其他位置。

Assembly assembly1 = Assembly.Load(“SomeAssembly”);

Assembly assembly2 = Assembly.LoadFrom(@“C:\Software\SomeOtherAssembly”);

查找自定义特性需要调用Attribute类的一个静态方法GetCustomAttributes()给它传递程序集的引用:GetCustomAttributes()有两个重载方法:如果除了程序集的引用外,没有给定其他参数,该方法就返回为这个程序集定义的所有自定义特性。也可以通过指定第二个参数来调用它,第二个参数是表示感兴趣的特性类的一个Type对象,这种情况下发挥一个数组,包含指定类型的所有特性。

Attribute supportsAttribute =Attribute.GetCustomAttributes(assembly1,typeof(SupportsWhatsNewAttribute));

 

续写在20160321

今天又读了有关于特性的别人写的博客。觉得对于特性这个概念的理解又加深了,正如那位博主所说,找正确的认识到特性与属性的区别。

特性是一种类型。不要将其当成修饰来看待。

博主在文章中讲到了,特性的使用场景。比如一个程序中有小明和小李写的代码,他们写的方法均有出现了bug和没有出bug两种情况。怎么样去区分。使用特性就很好。

这篇博客的地址如下:


http://liutiemeng.blog.51cto.com/120361/29201/

关于反射,如下博客写得挺好,供参考

http://blog.csdn.net/educast/article/details/2894892
特性:

http://liutiemeng.blog.51cto.com/120361/29201/

0 0
原创粉丝点击