文章内容参考了nuaaflm的反射学习系列2-特性(Attribute),链接地址为:http://www.cnblogs.com/nuaalfm/archive/2008/09/07/1286195.html
因为打算写一个简单的ORM实现,所以上网上参考了些资料,现在先介绍一下需要用到的一个重要的技术,特性(Attribute)。因为原文的作者已经介绍得很详细了,我就不自己写了,直接COPY过来。由于原作者使用的是.net3.5的,我把代码改成了2.0的版本。
先看一个简单的例子
[Table(Name="UserInfo")]
public class UserInfo
{
当C#编译器发现这个属性有一个特性Table时,首先会把字符串Attribute添加到这个名称的后面,形成一个组合名称TableAttribute,然后在其搜索路径的所有命名空间中搜索有相同类名的类。但要注意,如果该特性名结尾是Attribute,编译器就不会把该字符串加到组合名称中。所有的特性都是从System.Attribute类型上面派生的。
接着我们来看一下Table特性的定制格式
[AttributeUsageAttribute(AttributeTargets.Class, Inherited=true,AllowMultiple=false)]
public class TalbeAttribute:Attribute
{
在定义类型时使用System.AttributeUsage特性来表明这个自定义特性的使用范围,这里使用了Class样式,表示TableAttribute特性只能用在其它的Class类型前面,若放置在Interface或Struct类型前面,或者放在对象成员的前面则会出现编译错误。这里还是用语句 AllowMultiple=false 语句来表明对于一个类型,该特性只能用一次,若一个Class类型前面出现多个TableAttribute,则会出现编译错误。若设置AllowMultiple=true,则该特性可以多次定义,也就是一个Class类型前面可以出现多个相同类型的特性。不过这里我们假设一个对象只能映射到一个数据表上,没有多重映射,因此就指明对同一个类型该特性不能多次使用。Inherited参数设定为true,就表示应用到类或接口上的特性也可以自动应用到所派生的类或接口上。
我们再看一下定制TalbeAttribute特性的完整例子:
Code
[AttributeUsage(AttributeTargets.Class,AllowMultiple=false,Inherited=false)]
public class TableAttribute : Attribute
{
private string tableName;
public string TableName
{
get { return tableName; }
set { tableName = value; }
}
public TableAttribute()
{
this.tableName = null;
}
public TableAttribute(string tableName)
{
this.tableName = tableName;
}
}