反射学习系列2-特性(Attribute)

简介:

 

反射学习系列目录

反射学习系列1-反射入门

反射学习系列2-特性(Attribute)

反射学习系列3-反射实例应用

作者

 

 

先看一个简单的例子
[Table(Name="dbo.[User]")]
public partial class User 
{
当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特性的完整例子:

 

复制代码
 [AttributeUsageAttribute(AttributeTargets.Class, Inherited  =   false , AllowMultiple  =   false )]
    
public   class  TableAttribute : Attribute
    {
        
// 保存表名的字段
         private   string  _tableName;

        
public  TableAttribute()
        {
        }

        
public  TableAttribute( string  tableName)
        {
            
this ._tableName  =  tableName;
        }

        
///   <summary>
        
///  映射的表名(表的全名:模式名.表名)
        
///   </summary>
         public   string  TableName
        {
            
set
            {
                
this ._tableName  =  value;
            }
            
get
            {
                
return   this ._tableName;
            }
        }
    }
复制代码

 

 特性也是一个Class类型,可以有多个构造函数,就像C#的new语句一样,我们向类型附加特性时可以使用不同的初始化参数来指明使用特性的那个构造函数。我们附加特性时还可以使用“属性名=属性值”的方法来直接指明特性的属性值。该特性中定义了一个TableName属性,该属性就是被修饰的对象所映射的数据库表的名称。

下面我们举一个使用特性来进行O/RMapping的例子,也就是将对象转化成Sql语句

用户类:

ContractedBlock.gif User类

 

表特性

 

ContractedBlock.gif 表特性

 

列特性:

 

ContractedBlock.gif 列特性

 

 

ContractedBlock.gif ORMHelp

SqlStr中的内容为insert into User(userID,UserName) values('1','lfm')

前端使用代码:

 

ContractedBlock.gif 前端代码

作者

 源码下载


本文转自 你听海是不是在笑 博客园博客,原文链接:

http://www.cnblogs.com/nuaalfm/archive/2008/09/07/1286195.html

  ,如需转载请自行联系原作者

相关文章
|
5月前
Attribute特性的原理
Attribute特性的原理
26 0
|
5月前
|
C#
c#之Attribute特性的原理
c#之Attribute特性的原理
23 0
|
开发框架 .NET C#
C#——反射概念和关键类Type
C#——反射概念和关键类Type
104 0
|
开发框架 .NET 编译器
C#反射与特性(七): 自定义特性以及应用
C#反射与特性(七): 自定义特性以及应用
253 0
C#反射与特性(七): 自定义特性以及应用
C#反射与特性(四 实例化类型
C#反射与特性(四 实例化类型
239 0
C#反射与特性(四 实例化类型
|
C# 索引
C#反射与特性(八):反射操作的示例大全
C#反射与特性(八):反射操作的示例大全
304 0
|
算法 安全 C#
C#反射与特性(一):反射基础
C#反射与特性(一):反射基础
243 0
C#反射与特性(一):反射基础
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 分析使用 MetaClass 进行方法注入前后 mateClass 类型变化 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 分析使用 MetaClass 进行方法注入前后 mateClass 类型变化 )
116 0
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类进行方法注入的优缺点 )
【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类进行方法注入的优缺点 )
119 0