C#特性Attribute的實際應用之:代碼統計分析

作者: luminji  來源: 博客園  發布時間: 2011-01-03 22:07  閱讀: 1454 次  推薦: 0   原文鏈接   [收藏]  
摘要:C#中的Attribute是一種可由用戶自由定義的修飾符(Modifier),C#中的Attribute可以用來修飾各種需要被修飾的目標"。 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()
{

}
}

  4:統計分析模塊XP.CodeStatistics

  XP.CodeStatistics是本工具的核心模塊,包括了四個功能:獲取程序集、獲取IL代碼、統計分析。核心類如下,本文不再贅述,請直接查看源碼。

  5:生成報表

  由于對客戶端程序集添加了如上的特性信息的,所以,通過分析程序集,我們可以很方法得到如下的報表:

  備注:從項目管理的角度來說,本報表,僅僅是對工作量和代碼質量的一個輔助參考,但有此參考,會比沒有好。

  6:IL代碼查看

  細心的人,可能已經發現,上表所統計的僅僅是IL的代碼行數,而不是實際代碼行數。這是因為:

  1:首先,本分析工具是對程序集進行分析。所謂程序集,就是編譯為IL代碼的托管代碼;

  2:理論上,從IL代碼能反編譯為托管代碼(就像Reflactor一樣),但是,太復雜了,我們沒有去實現;

  3:即使反編譯IL代碼,得到的也不是原始的代碼。如果要分析原始代碼的,可以采用其它現成工具。

  所以,既然我們統計的是IL代碼,所以,本工具的一個輔助功能就是IL代碼的查看。本工具主頁面:

  源碼下載地址:

http://download.csdn.net/source/2946944

0
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()