C#特性Attribute的“.NET研究”实际应用之:代码统计分析

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

  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上海企业网站设计与制作span style="color: #000000;"> 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上海闵行企业网站设计与制作e="color: #000000;"> reviewDate)
{
Reviewer = revi上海闵行企业网站制作ewer;
ReviewDate = reviewDate;
}
public string Reviewer { get; private set; }
public string ReviewDate { get; private set; }
}

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class BugAttribute : Attribute
{
public上海网站建设tyle="color: #000000;"> BugAttribute(bool isBug, string bugDate)
{
this.IsBug = isBug;
上海企业网站制作yle="color: #0000ff;">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

时间: 2024-09-24 13:29:01

C#特性Attribute的“.NET研究”实际应用之:代码统计分析的相关文章

C# 动态语言特性,dynamic 关键字研究

原文:C# 动态语言特性,dynamic 关键字研究 1       动态语言简介 支持动态特性的语言现在大行其道,并且有继续增长的趋势.比如 Ruby 和 Python, 还有天王级的巨星 --- JavaScript. 现在一个程序员说自己对 JavaScript 根本没使用过,别人一定把你当成从火星回来的吧! 很多使用过 JavaScript 的程序员,刚开始对其动态特性深恶痛绝,欲除之而后快,但是一旦熟悉这个语言以后,又会发疯般的爱上她(我的野蛮女友). 以创建一个"人"为例,

温故而知新:c#中的特性(attribute)

特性(Attribute)是微软在.Net中自创的一种新技术,对于很多初学者来讲,特性一直是一块难啃的骨头. 既然弄不懂,那我们就暂时绕过它吧,回想一下我们在写代码时通常都要求写注释,为了是让别人或自己以后能看得懂,但是这个注释是写给"人"看的,突发奇想一下:我们能不能写出一种注释,给c#编译器看,比如我们在某些代码上打个标记,让编译器看到这些标记后,做出不同的反应? 其实...这就是特性,比如我们定义一个常规的类 public class Product { public strin

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

日常工作中,需要为程序集提供统计分析: 1:程序集方法数: 2:开发人员数目及各自所开发或REVIEW的方法数: 3:测试中,被标注有BUG的数目: 4:直接查看方法的IL代码: 鉴于以上统计的需要,特开发本EXE. 1:关于特性Attribute的知识补充 "Attribute是一种可由用户自由定义的修饰符(Modifier),可以用来修饰各种需要被修饰的目标".它的作用是为它们的修饰目标追加上一些额外的信息--比如"这个类是我写的"或者"这个函数以前出

一起谈.NET技术,C#特性Attribute的实际应用之:代码统计分析

日常工作中,需要为程序集提供统计分析: 1:程序集方法数: 2:开发人员数目及各自所开发或REVIEW的方法数: 3:测试中,被标注有BUG的数目: 4:直接查看方法的IL代码: 鉴于以上统计的需要,特开发本EXE. 1:关于特性Attribute的知识补充 "Attribute是一种可由用户自由定义的修饰符(Modifier),可以用来修饰各种需要被修饰的目标".它的作用是为它们的修饰目标追加上一些额外的信息--比如"这个类是我写的"或者"这个函数以前出

利用特性(Attribute)对实体类进行验证

对于XML的内容,我这边的处理方式是将它反序列化成实体对象,毕竟操作一 个实体对象比一大堆的XPath强多了. .net framework自带的XML序列化和反序列化类 System.Xml.Serialization.XmlSerializer由于内部实现过于复杂,导致性能不 佳.我这边自己实现了一个XML反序列化类,性能虽好但比较有针对性,所以今 天还是以.net framework自带的XML反序列化类作为示范. 比如说一个XML的内容是这样: <? xml version = "

深入研究Clang(九) Clang代码阅读之打log读流程2

继续上一篇,同样的hello.c,同样的执行过程,只不过继续添加了一些log信息,而且对代码进行了更近一步的挖掘.先看输入和输出的log信息(前半部分): shining@shining-VirtualBox:~/llvm-3.9.0/build/bin$ ./clang hello.c -o hello clang/tools/driver/driver.cpp/main()_begin/shining_add clang/lib/Driver/Driver.cpp/BuildCompilat

VS2010 测试功能之旅:编码的UI测试(4)-通“.NET研究”过编写测试代码的方式建立UI测试(上)

回顾 在之前的入门篇系列中,分别介绍了一个简单的示例, 操作动作的录制原理,通过修改UIMap.UItest文件控制操作动作代码的生成,对象的识别原理.接下来正式进入我们UI测试的进阶篇,在这一章,将讲述如何初步通过自己编写代码的方式来建立UI测试. 示例程序 一个系统的基本功能是增,删,改,查,其中增和改界面基本一样,删就几乎是一个按钮的事,所以我做了一个程序示例(下载点我),拥有增和查两个功能,之后的操作都将会在这个示例之上进行: 系统主窗口: 该系统拥有两个功能,"添加用户"和&

如何通过ildasm/ilasm修改assem“.NET研究”bly的IL代码

这段时间为跟踪一个Bug而焦头烂额,最后发现是Framework的问题,这让人多少有些绝望.所以到微软论坛提了个帖子,希望能得到些帮助.虽然论坛智能到能够判断楼主是否是MSDN订阅用户,以便尽快解决(传说MSDN订阅用户的问题能在两天内得到回复的,当时还很得意公司为我们购买的MSDN订阅账号),但得到的回复是"Could you file a bug report for this issue through Connect?",绝望之后的又一次寒心啊. 看过payeasy的广告之后,

“.NET研究”关于C# 中的Attribute 特性

Attribute与Proper上海企业网站制作ty 的翻译区别 Attribute 一般译作"特性",Property 仍然译为"属性". Attribute 是什么 Attribute 是一种可由用户自由定义的修饰符(Modifier),可以用来修饰各种需要被修饰的目标. 简单的说,Attribute就是一种"附着物" -- 就像牡蛎吸附在船底或礁石上一样. 这些附着物的作用是为它们的附着体追加上一些额外的信息(这些信息就保存在附着物的体内)