博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
反射学习系列2-特性(Attribute)
阅读量:6230 次
发布时间:2019-06-21

本文共 1660 字,大约阅读时间需要 5 分钟。

 

反射学习系列目录

 

 

先看一个简单的例子

[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

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

你可能感兴趣的文章
nagios客户端未启动报错
查看>>
南京大学周志华教授当选欧洲科学院外籍院士
查看>>
《OpenGL ES应用开发实践指南:Android卷》—— 1.3 初始化OpenGL
查看>>
马士兵教学语录
查看>>
计算机网络与Internet应用
查看>>
标签制作软件中如何导出标签模板为PDF文件?
查看>>
[CF919E]Congruence Equation
查看>>
Java IO最详解
查看>>
关于错误error C4430 error C2365 error C2078 error C2440 error C2143的处理。
查看>>
用python写一个抽奖程序
查看>>
npm使用入门(package.json)
查看>>
You are beautiful
查看>>
inline和宏之间的区别
查看>>
hibernate篇章五--Hibernage工作原理
查看>>
MongodDB学习笔记(二)(复制)
查看>>
oracle在线迁移同步数据,数据库报错
查看>>
Java中1.0 / 0.0 会输出什么?
查看>>
linux性能剖析工具
查看>>
DP ZOJ 3872 Beauty of Array
查看>>
jQuery Ajax实例 ($.ajax_$.post_$.get)
查看>>