[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/
关于反射,如下博客写得挺好,供参考