天天看點

C#特性Attribute的實際應用之:代碼統計分析1:關于特性Attribute的知識補充2:基礎子產品XP.AttributeClass3:引用XP.AttributeClass4:統計分析子產品XP.CodeStatistics5:生成報表 6:IL代碼檢視

日常工作中,需要為程式集提供統計分析:

1:程式集方法數;

2:開發人員數目及各自所開發或REVIEW的方法數;

3:測試中,被标注有BUG的數目;

4:直接檢視方法的IL代碼;

鑒于以上統計的需要,特開發本EXE。

    "Attribute是一種可由使用者自由定義的修飾符(Modifier),可以用來修飾各種需要被修飾的目标"。它的作用是為它們的修飾目标追加上一些額外的資訊——比如"這個類是我寫的"或者"這個函數以前出過問題"等等。

    它跟注釋的差別是:注釋是對程式源代碼的一種說明,主要目的是給人看的,在程式被編譯的時候會被編譯器所丢棄,是以,它絲毫不會影響到程式的執行。而Attribute是程式代碼的一部分,不但不會被編譯器丢棄,而且還會被編譯器編譯程序式集(Assembly)的中繼資料(Metadata)裡,在程式運作的時候,你随時可以從中繼資料裡提取出這些附加資訊來決策程式的運作。

    本文所依據的就是特性這個特點。

    根據文章開頭的要求:統計開發者、reviewer、bug資訊,需要建立一個可被用戶端項目引用的類庫項目XP.AttributeClass。該項目包含三個Attribute類:CreaterAttribute、ReviewerAttribute、BugAttribute。分别如下:

<a></a>

代碼

[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; }

在我們自己的程式集中,需要為自己的類或方法加上這類特性,參考如下:

[CreaterAttribute("join", "2010年12月14日")]

class class1

[BugAttribute(true, "2010年12月14日")]

[ReviewerAttribute("hy", "2010年12月14日")]

private void Test1()

public void Test2()

public void Test3()

    XP.CodeStatistics是本工具的核心子產品,包括了四個功能:擷取程式集、擷取IL代碼、統計分析。核心類如下,本文不再贅述,請直接檢視源碼。

    由于對用戶端程式集添加了如上的特性資訊的,是以,通過分析程式集,我們可以很方法得到如下的報表:

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

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

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

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

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

    是以,既然我們統計的是IL代碼,是以,本工具的一個輔助功能就是IL代碼的檢視。本工具首頁面:

本文轉自最課程陸敏技部落格園部落格,原文連結:http://www.cnblogs.com/luminji/archive/2010/12/29/1920452.html,如需轉載請自行聯系原作者

繼續閱讀