在C#的有些教材里,有人把Attribute翻译成属性,但是在C#里还有一个Priority,也被翻成属性。因此在比较严谨的教材里,会直接用Attribute这个英文,也有些教材会翻译成特性。
C#的Attribute主要用在反射时,可以获取这个类,属性成员等的额外信息。
比如我们在操作数据库时,常常会把数据库一行数据,转换成一个Entity。在读数据库时会根据这个Entity里的属性生成一个SQL查询语句。而这个查询语句的字段和表名,就是来自Entity的Attribute。
[TableAttribute("TBLUSERINFO")]
public classDBTableEntity
{
string _userName = "";
[FieldMapAttribute("USERNAME")]
public stringUserName
{
get{ return _userName; }
set{ _userName = value; }
}
string _userPwd = "";
[FieldMapAttribute("USERPASSWORD")]
public stringUserPwd
{
get{ return _userPwd; }
set{ _userPwd = value; }
}
}
/// <summary>
/// 该Attribute定义了数据库各栏位的信息
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public classFieldMapAttribute : Attribute
{
string _fieldName = "";
public stringFieldName
{
get{ return _fieldName; }
set{ _fieldName = value; }
}
public FieldMapAttribute(string fieldName)
{
FieldName = fieldName;
}
}
TableAttribute attritute2 = typeof(DBTableEntity).GetCustomAttributes(typeof(TableAttribute),false)[0] as TableAttribute;
stringtableName = attritute2.TableName;
首先定义一个Attribute,写法跟定义 Class一样,只是需要继承Attribute。有一个构造函数,传入参数。
然后在属性或类上使用Attribute,如[FieldMapAttribute("USERNAME")],写法像调用一个函数,只是需要用[]包起来。
最后反射DBTableEntity,获取他的Attribute。
提供的源码中,完整地实现了,定义Attribute,使用Attribute,遍历Attribute,获取Attribute的值,从而可以拼出一个完成的SQL语句:SELECT USERNAME,USERPASSWORD FROMTBLUSERINFO
另外,在.Net中还有一些常用的Attribute,比如DllImport,Seriallize,WebService等。源码中实现了DllImport实现了调用Windows API的代码,功能是创建一个文件夹。有了这个Attribute,凡是Window API能做的事,.Net也都可以做。这个Attribute非常强大,也可以调用如播放影音,WinRar压缩等功能。
源码下载地址,请在那个不能显示的图片上点右键,文件另存为,把jpg的后缀改成zip