zoukankan      html  css  js  c++  java
  • 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()
    {

    }
    }

    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

    备注(参考):

    http://www.cnblogs.com/luminji/archive/2010/11/30/1891692.html

    http://www.codeproject.com/KB/cs/sdilreader.aspx

    http://blog.csdn.net/fantasiax/archive/2007/05/28/1627694.aspx

    http://blog.csdn.net/fantasiax/archive/2007/06/04/1636913.aspx

     

     

    Creative Commons License本文基于Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名http://www.cnblogs.com/luminji(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
  • 相关阅读:
    css技巧---电子表体字体引入
    解决for循环,暂停3s,在执行下次循环
    node 将汉字转化为拼音
    针对CMS中的tag标签理解
    博客园上传markdown文件方法
    正则表达式匹配非某字符串的情况
    ubuntu 20.04 MySQL的workbench无法连接
    在ubuntu20.04上使用Navicat客户端
    如何提升git clone的速度
    jenkins出现故障,报错HTTP ERROR 403 No valid crumb was included in the request
  • 原文地址:https://www.cnblogs.com/luminji/p/1920452.html
Copyright © 2011-2022 走看看