技术开发 频道

C#特性Attribute实际应用:代码统计分析

  日常工作中,需要为程序集提供统计分析:

  1:程序集方法数;

  2:开发人员数目及各自所开发或REVIEW的方法数;

  3:测试中,被标注有BUG的数目;

  4:直接查看方法的IL代码;

  鉴于以上统计的需要,特开发本EXE。

  1:关于特性Attribute的知识补充

  "Attribute是一种可由用户自由定义的修饰符(Modifier),可以用来修饰各种需要被修饰的目标"。它的作用是为它们的修饰目标追加上一些额外的信息——比如"这个类是我写的"或者"这个函数以前出过问题"等等。

  它跟注释的区别是:注释是对程序源代码的一种说明,主要目的是给人看的,在程序被编译的时候会被编译器所丢弃,因此,它丝毫不会影响到程序的执行。而Attribute是程序代码的一部分,不但不会被编译器丢弃,而且还会被编译器编译进程序集(Assembly)的元数据(Metadata)里,在程序运行的时候,你随时可以从元数据里提取出这些附加信息来决策程序的运行。

  本文所依据的就是特性这个特点。

  2:基础模块XP.AttributeClass

  根据文章开头的要求:统计开发者、reviewer、bug信息,需要创建一个可被客户端项目引用的类库项目XP.AttributeClass。该项目包含三个Attribute类:CreaterAttribute、ReviewerAttribute、BugAttribute。分别如下:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]  
public class CreaterAttribute : Attribute    {        
public CreaterAttribute(string creater, string createDate)        
{          
Creater
= creater;          
CreateDate
= createDate;    
   }        
public string Creater { get; private set;
}        
public string CreateDate { get; private set;
}    
}    
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple
= true)]    
public class ReviewerAttribute : Attribute    {        
public ReviewerAttribute(string reviewer, string reviewDate)        
{            
Reviewer
= reviewer;            
ReviewDate
= reviewDate;      
}        
public string Reviewer { get; private set;
}        
public string ReviewDate { get; private set;
}    
}    
[AttributeUsage(AttributeTargets.Method, AllowMultiple
= false)]    
public class BugAttribute : Attribute    {        
public BugAttribute(bool isBug, string bugDate)        
{          
this.IsBug
= isBug;          
this.BugDate
= bugDate;      
}        
public bool IsBug { get; private set; }        public string BugDate { get; private set;
}    
}

 

  3:引用XP.AttributeClass

  在我们自己的程序集中,需要为自己的类或方法加上这类特性,参考如下:

  [CreaterAttribute("join", "2010年12月14日")]  
class class1  
{      
[CreaterAttribute(
"join", "2010年12月14日")]        
[BugAttribute(
true, "2010年12月14日")]
[ReviewerAttribute(
"hy", "2010年12月14日")]        
private void Test1()        
{        }        
[ReviewerAttribute(
"hy", "2010年12月14日")]          
public void Test2()        {        }        
public void Test3()        {        }    
}

 

0
相关文章