今天学习了一下Attribute的用法,其实也不是自愿的;只不过看到越来越多的项目里用到了Attribute这个东西,(比如Gentle.Net和Xpo.Net里面那种基于属性的O/R映射,还有由[Serializable]描述的类,)起初不明白怎么回事情,没有理会,知道看了sdk才发现这个东西可能在技术上并不难被理解,但是确实不是那么简单的一个对原数据的扩展这么几个字,它可以方便的完成很多我们以前很难完成的任务;
在sdk里面对属性的解释是这样的“公共语言运行库允许您添加类似关键字的描述性声明(称为属性)来批注编程元素,如类型、字段、方法和属性”;我的理解就是这个东西是能够永久保存到程序集可执行代码文件里的注释,而不是那种一般写给人看的注释,是“写给程序看的注释”;实验了一段代码:
static void <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />Main() <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
{
metaInfo mi=(metaInfo)Attribute.GetCustomAttribute(typeof(Win32API),typeof(metaInfo));
System.Console.WriteLine(mi.MetaName);
Console.WriteLine(mi.Info);
Console.ReadLine();
}
[metaInfo("Win32APIWarpper",Info="这是一个对WIN32API函数进行包装的类!")]
public class Win32API
{
public Win32API()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
[DllImport("KERNEL32.DLL", EntryPoint="MoveFileW", SetLastError=true,CharSet=CharSet.Unicode, ExactSpelling=true,CallingConvention=CallingConvention.StdCall)]
public static extern bool MoveFile(String src, String dst);
}
public class metaInfo:System.Attribute
{
private string metaname;
private string info;
public metaInfo(string mn)
{
metaname=mn;
}
public string MetaName
{
get{return metaname;}
}
public string Info
{
get{return info;}
set{info=value;}
}
}
我觉得这段代码有两个能看的地方,一是输出结果:
Win32APIWarpper
这是一个对WIN32API函数进行包装的类!
这里简单的实现了不被编译器过滤掉的注释,类的说明;我觉得这个就很想vs.net2003对象浏览器的那个功能了,它能对所有.net类库中的相关内容都显示一个提示性的摘要,我以前一直在想,这个是怎么实现的呢?我自己写出来的程序不论怎么写注释,就是用///summary注释在编译完成后也不能在别人机器上得到元数据级的注释;通过实践我有那么一点点思路了,至少我有一种方法实现这种功能,尽管我现在还不明白.net类库是怎么实现的。。呵呵;
还有一个地方就是:
[DllImport("KERNEL32.DLL", EntryPoint="MoveFileW", SetLastError=true,CharSet=CharSet.Unicode, ExactSpelling=true,CallingConvention=CallingConvention.StdCall)]
我觉得这个就是让程序在执行的时候,是的,我觉得是执行的时候去找到这个函数的位置究竟在哪个dll里面,而并不是在编译的时候就进行处理的!
其他对属性的使用经常可以看到,像Gentle.net中需要对要被持久化的类的相应用属性进行元数据级别的“注释”,然后用Broker进行持久操作的时候,就能由类的字段的附加属性来控制持久化的操作方式;
还有在WebService里面对要暴露的方法进行[WebMethod]标示,对服务接口要显示的描述进行[Description]标示等等,太多了,继续慢慢研究中...
其中若有什么问题,希望高手们马上指出!