首页 | 互联网 | IT动态 | Cisco | Windows | Linux | Java | .Net | Oracle | 华为 | 存储世界 | 服务器 | 网络设备 | IDC | 安全 | 求职招聘
IT培训 | 数字网校 | 技术专题 | 电子书下载 | 教学视频 | 网页设计 | 平面设计 | 解决方案 | 直播室 | 虚拟考场 | 搜索 | 博客 | 沙龙 | 论坛
首页 | JAVA | C# | VB | VB.NET | C/C++ | delphi | 工程管理 | 其他语言 | 论坛
各大城市软件开发培训、软件人才免费咨询热线:400-700-5807
 您现在的位置: 中国IT实验室 >> 桌面开发 >> C# >> 文章正文
在Visual C#中定义和使用自己的特性
来源:ChinaItLab 作者:佚名 时间:2007-8-30



  一些读者可能会感到惊奇,因为对于源代码修改的信息可以通过使用注释这种传统的做法。.net已经使用工具,通过在注释里使用XML块,把这些信息很好的组织起来。

  在源代码对应的位置,你可以很容易的看到你的注释。你可以通过文本,分析源代码里的注释,从而处理这些信息,但是这个过程是单调冗长的,并且很容易出现错误。.NET提供了工具来处理注释里的XML块,这样可以消除此类问题。

  使用自定义特性可以使你达到同样的效果,它同样提供了一种可以有效组织的方法,用于记录和处理这些信息,并且它还有一个额外的优势。考虑如下情况,当把源代码编译成二进制代码的时候,你是否已经丢失了代码的注释?毫无疑问,注释已经作为副产品,永远的从可执行代码里移出。相比之下,特性的值已经变成了元数据的一部分,永远的绑定到一个程序集里。在没有源代码的情况下,你依然可以访问这些注释信息。

  另外,在源代码里允许特性构造一个与当初在设计时值一样的实例。

  获取自定义特性的值

  到此,尽管你已经在类和方法上应用了自定义属性,但在实战中你还没有真正的看到它。不管你是否附加了特性,看起来好像什么事情也没有发生。但事实上,事情已经发生了变化,你完全不用理会我的话,你可以用MSIL反编译工具,打开一个包含使用了自定义特性类型的EXE或者DLL文件。MSIL反编译工具能使你看到在IL代码里你定义的特性和它的值。图一是使用ILDASM工具,打开本文中例子编译的EXE文件所看到的。


图一:C#特性

  尽管通过反编译程序集,看到了特性的值,证明了它们的确存在,但是你仍然没有看到跟它们相关的行为。那么现在,你就可以使用反射API遍历一个程序集包含的类型,查询你自定义的特性,在应用了特性的类型上获取特性的值。

  考虑如下测试代码的一般的做法。程序加载指定的程序集,得到一个包含程序集中所有成员的数组,在它们中间,迭代寻找应用了[DefectTrack]特性的类。对于应用了[DefectTrack]特性的类,测试程序将在控制台上输出特性的值。对于类型中的方法,程序仍然采用了同样的步骤和迭代。这些循环采用它们的方式在整个程序集里“游走”。

using System ;
using System.Reflection ;
using MyAttributeClasses ;

public class TestMyAttribute
{
public static void Main( )
{
DisplayDefectTrack( "MyAttributes" ) ;
Console.ReadLine();
}

public static void DisplayDefectTrack(
string lcAssembly )
{
Assembly loAssembly =
Assembly.Load( lcAssembly ) ;

Type[ ] laTypes = loAssembly.GetTypes( ) ;

foreach( Type loType in laTypes )
{
Console.WriteLine("*======================*" ) ;
Console.WriteLine( "TYPE:\t" +
loType.ToString( ) ) ;
Console.WriteLine( "*=====================*" ) ;

object[ ] laAttributes =
loType.GetCustomAttributes(
typeof( DefectTrackAttribute ),
false ) ;

if( laAttributes.Length > 0 )
Console.WriteLine( "\nMod/Fix Log:" ) ;

foreach( Attribute loAtt in laAttributes )
{
DefectTrackAttribute loDefectTrack =
(DefectTrackAttribute)loAtt ;

Console.WriteLine( "----------------------" ) ;
Console.WriteLine( "Defect ID:\t" +
loDefectTrack.DefectID ) ;
Console.WriteLine( "Date:\t\t" +
loDefectTrack.ModificationDate ) ;
Console.WriteLine( "Developer ID:\t" +
loDefectTrack.DeveloperID ) ;
Console.WriteLine( "Origin:\t\t" +
loDefectTrack.Origin ) ;
Console.WriteLine( "Comment:\n" +
loDefectTrack.FixComment ) ;
}

MethodInfo[ ] laMethods =
loType.GetMethods(
BindingFlags.Public |
BindingFlags.Instance |
BindingFlags.DeclaredOnly ) ;

if( laMethods.Length > 0 )
{
Console.WriteLine( "\nMethods: " ) ;
Console.WriteLine( "----------------------" ) ;
}

foreach( MethodInfo loMethod in laMethods )
{
Console.WriteLine( "\n\t" +
loMethod.ToString( ) ) ;

object[ ] laMethodAttributes =
loMethod.GetCustomAttributes(
typeof( DefectTrackAttribute ),
false ) ;

if( laMethodAttributes.Length > 0 )
Console.WriteLine( "\n\t\tMod/Fix Log:" ) ;

foreach( Attribute loAtt in laMethodAttributes )
{
DefectTrackAttribute loDefectTrack =
(DefectTrackAttribute)loAtt ;
Console.WriteLine( "\t\t----------------" ) ;
Console.WriteLine( "\t\tDefect ID:\t" +
loDefectTrack.DefectID ) ;
Console.WriteLine( "\t\tDeveloper ID:\t" +
loDefectTrack.DeveloperID ) ;
Console.WriteLine( "\t\tOrigin:\t\t" +
loDefectTrack.Origin ) ;
Console.WriteLine( "\t\tComment:\n\t\t" +
loDefectTrack.FixComment ) ;
}
}
Console.WriteLine( "\n\n" ) ;
}
}
}

 

上一页  [1] [2] [3] [4] [5] 下一页  

【责编:Youping】
中国IT教育热线咨询
相关文章
如何使用Delphi实现无边界窗体的移动
C语言中的位域的使用
用Visual C#实现网络封包监视
Java程序开发中代理技术的使用方法
在VB.NET编程中使用数组
使用C++异常来取代exit()函数
怎样使用Eclipse平台调试您的软件项目
在Java中使用Draw2D和SWT绘图
定义客户需求的原则和方法
推荐文章

 精彩友情推荐
·锐捷交换机报价
·锐捷交换机
·锐捷网络网络交换机
·smc交换机
·smc交换机报价
·IDC资讯大全
·机房品质万里行
·IDC托管必备知识
·全国IDC报价
·网站推广优化
最新更新 推荐文章
·框架:J2EE WEB应用架构分析03-13
·几种VC++数据库开发技术的相对比…03-13
·利用C#实现标注式消息提示窗口03-13
·用C#创建COM对象03-13
·Visual C#多线程参数传递浅析03-13
·Visual C#多线程参数传递浅析03-13
·基于HOOK和MMF的Win密码渗透技术11-15
·Visual C++设计超强仿QQ自动伸缩…11-15
·Java SE 6.0实现高质量桌面集成开…11-15
·史玉柱东山再起幕后高人11-15
·Visual Basic 9.0隐式类型的局部…09-30
·用C#创建COM对象09-06
·IT管理十大失误及其对策08-30
·VC中利用MFC设计绘图程序初步08-23
·JAVA中对象创建和初始化过程08-23
·C语言中的位域的使用08-09
·浅谈Java桌面应用程序开发08-09
·C#的前途如何?08-02
·几种VC++数据库开发技术的相对比较07-12
·用Visual C#实现网络封包监视07-12
·VB.NET中的TextBox控件详解07-12
·VB.NET实现PC与掌上电脑PPC的双向通信07-05