11第十三章属性和反射课件_第1页
11第十三章属性和反射课件_第2页
11第十三章属性和反射课件_第3页
11第十三章属性和反射课件_第4页
11第十三章属性和反射课件_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向对象编程

——属性和反射面向对象编程

——属性和反射在本章,你将学到:创建自定义属性使用反射抽取元数据

目标在本章,你将学到:目标属性AttributeProperty属性AttributeProperty属性PropertyclassEmployee{

privatestaticstring_name;

privatestaticstring_id;

staticvoidMain(string[]args) {

_name=Console.ReadLine();

_id=Console.ReadLine(); }}直接访问字段不经验证

属性PropertyclassEmployee直接访问classEmployee{privatestaticstring_name;privatestaticstring_id;publicvoidSetId(value){ //验证输入长度小于2 if(_id.Length>2) _id=value;}publicstringGetId(){ return_id;}}方法SetId(Value)和GetId()分别读取和写入职员ID

…Employeeemp;emp.SetId("A1");stringDepartment=emp.Get()…每次都调用GetId()和SetId()方法会很繁琐属性classEmployee方法SetId(Value)classEmployee{privatestaticstring_name;privatestaticstring_id;publicstringId{ get { return_id; } set { //验证输入长度小于2 if(_id.Length>2) _id=value; } }}读取

ID时调用

将值赋给

ID时调用

classEmployee读取ID时调用将值赋给I

[访问修饰符]数据类型属性名

{ get{}; set{};}读/写属性可以赋值和检索值[访问修饰符]数据类型属性名读/写属性可以赋值和检索值[访问修饰符]数据类型属性名{ get{};}只读属性只能检索值[访问修饰符]数据类型属性名只读属性只能检索值[访问修饰符]数据类型属性名{set{};}只写属性只能赋值[访问修饰符]数据类型属性名只写属性只能赋值[访问修饰符]static数据类型属性名{ get{}; set{};}静态属性应用于整个类而不是类的实例只能访问类的静态成员[访问修饰符]static数据类型属性名静态属性应用于整classSavingsAccount{

//类字段用于存储帐号、余额和已获利息

privateint_accountNumber;

privatedouble_balance;

privatedouble_interestEarned;

//利率是静态的,因为所有帐户获得的利息相同

privatestaticdouble_interestRate;

//构造函数初始化类成员

publicSavingsAccount(intaccountNumber,doublebalance) {

this._accountNumber=accountNumber;

this._balance

=balance; }

//只读AccountNumber属性

publicintAccountNumber {

get {

return_accountNumber; } }只读属性

classSavingsAccount只读属性staticvoidMain(string[]args){

//创建SavingsAccount的对象

SavingsAccountobjSavingsAccount= newSavingsAccount(12345,5000);;

Console.WriteLine("输入到现在为止已获得的利息和利率");

objSavingsAccount.InterestEarned= Int64.Parse(Console.ReadLine());

SavingsAccount.InterestRate= Int64.Parse(Console.ReadLine());

objSavingsAccount.InterestEarned+= objSavingsAccount.Balance* SavingsAccount.InterestRate; Console.WriteLine("获得的总利息为:{0}", objSavingsAccount.InterestEarned);}publicdoubleInterestEarned{

get {

return_interestEarned; }

set {

//验证数据

if(value<0.0) {

Console.WriteLine(“利息 不能为负数");

return; }

_interestEarned=value; }}将设置InterestEarned

属性staticvoidMain(string[]argsstaticvoidMain(string[]args){

//创建SavingsAccount的对象

SavingsAccountobjSavingsAccount= newSavingsAccount(12345,5000);;

Console.WriteLine("输入到现在为止已获得的利息和利率");

objSavingsAccount.InterestEarned= Int64.Parse(Console.ReadLine());

SavingsAccount.InterestRate= Int64.Parse(Console.ReadLine());

objSavingsAccount.InterestEarned+= objSavingsAccount.Balance* SavingsAccount.InterestRate; Console.WriteLine("获得的总利息为:{0}", objSavingsAccount.InterestEarned);}将设置InterestRate

属性publicstaticdoubleInterestRate{

get {

return_interestRate; }

set {

//验证数据

if(value<0.0) {

Console.WriteLine(“利率不能为负数");

return; }

else {

_interestRate=value/100; }}staticvoidMain(string[]argsstaticvoidMain(string[]args){

//创建SavingsAccount的对象

SavingsAccountobjSavingsAccount= newSavingsAccount(12345,5000);;

Console.WriteLine(“输入到现在为止已获得的利息和利率");

objSavingsAccount.InterestEarned= Int64.Parse(Console.ReadLine());

SavingsAccount.InterestRate= Int64.Parse(Console.ReadLine());

objSavingsAccount.InterestEarned+= objSavingsAccount.Balance* SavingsAccount.InterestRate; Console.WriteLine("获得的总利息为:{0}", objSavingsAccount.InterestEarned);}将检索Balance

和InterestRate

属性publicdoubleBalance{

get {

if(_balance<0)

Console.WriteLine("没有可用余额");

return_balance; }}staticvoidMain(string[]args属性(Attribute)属性(Attribute)是一种新型的声明信息。我们可以使用属性来定义设计时的信息(比如帮助文件、文档的链接),以及运行时的信息(比如将一个类的域与一个XML的域相关联)。我们也可以用属性来创建“自描述”的组件(可以提供该组件的描述信息)。属性(Attribute)属性(Attribut预定义属性ConditionalWebMethodDllImportObsolete自定义属性属性(Attribute)预定义属性属性(Attribute)usingSystem;publicclassAnyClass{[Obsolete("别用Old这个老方法了,请用New方法",true)]staticvoidOld(){}staticvoidNew(){}publicstaticvoidMain(){Old();}}usingSystem;.NET框架允许创建自定义属性,它可以被用于存储信息和在运行时被获取。这个信息可以与任何目标元素相关,依赖与设计和程序的需要。为了创建自定义属性,你需要:定义自定义属性命名自定义属性构造自定义属性为目标元素应用自定义属性创建自定义属性.NET框架允许创建自定义属性,它可以被用于存储信息和在运行定义自定义属性:一个新自定义属性类来源于System.Attribute系统类。你需要使用预定义的属性应用属性目标到新的自定义属性类,AttributeUsage,如下面的代码所示:[AttributeUsage(AttributeTargets.Class|AttributeTargets.Constructor|

AttributeTargets.Field|AttributeTargets.Method|AttributeTargets.Property,AllowMultiple=true)]创建自定义属性(续)定义自定义属性:创建自定义属性(续)AttributeUsage属性接受两个参数:一个参数是表示目标元素的一系列标志。其他参数是表示一个给定的元素是否被应用于多个这样属性的标志。

除了AllowMultiple特性,还有其他特性可以与属性一起使用。这些特性是:InheritedValidOn创建自定义属性(续)AttributeUsage属性接受两个参数:创建自定义属性下表列出了AttributeTargets枚举器的各种成员名称。创建自定义属性(续)成员名称属性目标All元素包括汇编、类、类成员、代理、枚举、事件、域、接口、方法、模块、参数、特性或结构Assembly仅汇编Class类的实例ClassMembers类、结构、枚举、构造函数、方法、属性、域、事件、代理和接口Constructor类构造函数DelegateDelegate方法Enum定义的枚举Event定义的事件Field域Interface接口Method定义的方法Module单一模块Parameter方法的参数Property特性(get和set,如果实现的话)Struct结构下表列出了AttributeTargets枚举器的各种成员名命名自定义属性:通常的约定是在属性名称后添加单词Attribute。编译器通过允许你使用名称的简短版本来调用属性以支持添加。创建自定义属性(续)命名自定义属性:创建自定义属性(续)构造自定义属性:每个属性必须包含至少一个构造函数。位置参数通过构造函数被以构造函数中声明的顺序传递,如下面的代码段所示:

publicBugFixingAttribute(intBugNo,string Developer,stringDateFixed) { this.BugNo=BugNo; this.Developer=Developer; this.DateFixed=DateFixed; }创建自定义属性(续)定位参数构造自定义属性:创建自定义属性(续)定位参数创建自定义属性(续)命名参数被实现为特性,如下面的代码段所示:publicstringRemarks{ get{returnRemarks;}set{Remarks=value;}}创建自定义属性(续)命名参数被实现为特性,如下面的代码段所示为位置参数创建只读属性是很常见的:publicintBugNo{ get{returnBugNo;}}创建自定义属性(续)为位置参数创建只读属性是很常见的:创建自定义属性(续)创建自定义属性(续)应用自定义属性:属性可以通过将它立刻放置在它的目标之前被应用。为了测试上述例子的BugFixAttribute属性,你可以创建一个简单的名为Calculator类的程序,给出四个函数。你需要指定BugFixAttribute为目标元素类以记录它的代码维护历史,如下面的代码所示:[BugFixingAttribute(125,"SaraLevo","08/15/06",Remarks="Returnobjectnotspecified")][BugFixingAttribute(159,"SaraLevo","08/17/06",Remarks="DataTypeMismatch")]创建自定义属性(续)应用自定义属性:[AttributeUsage(AttributeTargets.All,AllowMultiple=false,Inherited=false)]publicclassHelpAttribute:Attribute{publicHelpAttribute(StringDescription_in){this.description=Description_in;}protectedStringdescription;publicStringDescription{get{returnthis.description;}}}[Help("thisisado-nothingclass")]publicclassAnyClass{[Help("thisisado-nothingmethod")]//errorpublicvoidAnyMethod(){}}[AttributeUsage(AttributeTarge使用反射抽取元数据反射在运行时被使用在获得类型信息的过程中。提供访问运行程序的元数据的类时在System.Reflection命名空间中。System.Reflection命名空间包含允许程序员获取关于运行的程序的信息的类,以动态的添加类型、值和对象到那个程序。使用反射抽取元数据反射在运行时被使用在获得类型信息的过程中。使用反射抽取元数据(续)反射通常用于下面的任务:浏览元数据完成类型发现方法和特性的后期绑定反射发出使用反射抽取元数据(续)反射通常用于下面的任务:使用反射抽取元数据(续)浏览元数据:为了使用反射来浏览元数据,System.Reflection命名空间的MemberInfo对象需要被实例化。

这个对象有助于发现成员的属性并且提供对元数据的访问。使用反射抽取元数据(续)浏览元数据:在本章中,你已经学到:自定义属性是你根据需要创建的属性。你添加属性的元素被称为属性目标。反射在运行时获取类型信息的过程中被使用。反射通常用于完成如下任务:浏览元数据完成类型发现方法和属性的后期绑定反射发出小结在本章中,你已经学到:小结面向对象编程

——属性和反射面向对象编程

——属性和反射在本章,你将学到:创建自定义属性使用反射抽取元数据

目标在本章,你将学到:目标属性AttributeProperty属性AttributeProperty属性PropertyclassEmployee{

privatestaticstring_name;

privatestaticstring_id;

staticvoidMain(string[]args) {

_name=Console.ReadLine();

_id=Console.ReadLine(); }}直接访问字段不经验证

属性PropertyclassEmployee直接访问classEmployee{privatestaticstring_name;privatestaticstring_id;publicvoidSetId(value){ //验证输入长度小于2 if(_id.Length>2) _id=value;}publicstringGetId(){ return_id;}}方法SetId(Value)和GetId()分别读取和写入职员ID

…Employeeemp;emp.SetId("A1");stringDepartment=emp.Get()…每次都调用GetId()和SetId()方法会很繁琐属性classEmployee方法SetId(Value)classEmployee{privatestaticstring_name;privatestaticstring_id;publicstringId{ get { return_id; } set { //验证输入长度小于2 if(_id.Length>2) _id=value; } }}读取

ID时调用

将值赋给

ID时调用

classEmployee读取ID时调用将值赋给I

[访问修饰符]数据类型属性名

{ get{}; set{};}读/写属性可以赋值和检索值[访问修饰符]数据类型属性名读/写属性可以赋值和检索值[访问修饰符]数据类型属性名{ get{};}只读属性只能检索值[访问修饰符]数据类型属性名只读属性只能检索值[访问修饰符]数据类型属性名{set{};}只写属性只能赋值[访问修饰符]数据类型属性名只写属性只能赋值[访问修饰符]static数据类型属性名{ get{}; set{};}静态属性应用于整个类而不是类的实例只能访问类的静态成员[访问修饰符]static数据类型属性名静态属性应用于整classSavingsAccount{

//类字段用于存储帐号、余额和已获利息

privateint_accountNumber;

privatedouble_balance;

privatedouble_interestEarned;

//利率是静态的,因为所有帐户获得的利息相同

privatestaticdouble_interestRate;

//构造函数初始化类成员

publicSavingsAccount(intaccountNumber,doublebalance) {

this._accountNumber=accountNumber;

this._balance

=balance; }

//只读AccountNumber属性

publicintAccountNumber {

get {

return_accountNumber; } }只读属性

classSavingsAccount只读属性staticvoidMain(string[]args){

//创建SavingsAccount的对象

SavingsAccountobjSavingsAccount= newSavingsAccount(12345,5000);;

Console.WriteLine("输入到现在为止已获得的利息和利率");

objSavingsAccount.InterestEarned= Int64.Parse(Console.ReadLine());

SavingsAccount.InterestRate= Int64.Parse(Console.ReadLine());

objSavingsAccount.InterestEarned+= objSavingsAccount.Balance* SavingsAccount.InterestRate; Console.WriteLine("获得的总利息为:{0}", objSavingsAccount.InterestEarned);}publicdoubleInterestEarned{

get {

return_interestEarned; }

set {

//验证数据

if(value<0.0) {

Console.WriteLine(“利息 不能为负数");

return; }

_interestEarned=value; }}将设置InterestEarned

属性staticvoidMain(string[]argsstaticvoidMain(string[]args){

//创建SavingsAccount的对象

SavingsAccountobjSavingsAccount= newSavingsAccount(12345,5000);;

Console.WriteLine("输入到现在为止已获得的利息和利率");

objSavingsAccount.InterestEarned= Int64.Parse(Console.ReadLine());

SavingsAccount.InterestRate= Int64.Parse(Console.ReadLine());

objSavingsAccount.InterestEarned+= objSavingsAccount.Balance* SavingsAccount.InterestRate; Console.WriteLine("获得的总利息为:{0}", objSavingsAccount.InterestEarned);}将设置InterestRate

属性publicstaticdoubleInterestRate{

get {

return_interestRate; }

set {

//验证数据

if(value<0.0) {

Console.WriteLine(“利率不能为负数");

return; }

else {

_interestRate=value/100; }}staticvoidMain(string[]argsstaticvoidMain(string[]args){

//创建SavingsAccount的对象

SavingsAccountobjSavingsAccount= newSavingsAccount(12345,5000);;

Console.WriteLine(“输入到现在为止已获得的利息和利率");

objSavingsAccount.InterestEarned= Int64.Parse(Console.ReadLine());

SavingsAccount.InterestRate= Int64.Parse(Console.ReadLine());

objSavingsAccount.InterestEarned+= objSavingsAccount.Balance* SavingsAccount.InterestRate; Console.WriteLine("获得的总利息为:{0}", objSavingsAccount.InterestEarned);}将检索Balance

和InterestRate

属性publicdoubleBalance{

get {

if(_balance<0)

Console.WriteLine("没有可用余额");

return_balance; }}staticvoidMain(string[]args属性(Attribute)属性(Attribute)是一种新型的声明信息。我们可以使用属性来定义设计时的信息(比如帮助文件、文档的链接),以及运行时的信息(比如将一个类的域与一个XML的域相关联)。我们也可以用属性来创建“自描述”的组件(可以提供该组件的描述信息)。属性(Attribute)属性(Attribut预定义属性ConditionalWebMethodDllImportObsolete自定义属性属性(Attribute)预定义属性属性(Attribute)usingSystem;publicclassAnyClass{[Obsolete("别用Old这个老方法了,请用New方法",true)]staticvoidOld(){}staticvoidNew(){}publicstaticvoidMain(){Old();}}usingSystem;.NET框架允许创建自定义属性,它可以被用于存储信息和在运行时被获取。这个信息可以与任何目标元素相关,依赖与设计和程序的需要。为了创建自定义属性,你需要:定义自定义属性命名自定义属性构造自定义属性为目标元素应用自定义属性创建自定义属性.NET框架允许创建自定义属性,它可以被用于存储信息和在运行定义自定义属性:一个新自定义属性类来源于System.Attribute系统类。你需要使用预定义的属性应用属性目标到新的自定义属性类,AttributeUsage,如下面的代码所示:[AttributeUsage(AttributeTargets.Class|AttributeTargets.Constructor|

AttributeTargets.Field|AttributeTargets.Method|AttributeTargets.Property,AllowMultiple=true)]创建自定义属性(续)定义自定义属性:创建自定义属性(续)AttributeUsage属性接受两个参数:一个参数是表示目标元素的一系列标志。其他参数是表示一个给定的元素是否被应用于多个这样属性的标志。

除了AllowMultiple特性,还有其他特性可以与属性一起使用。这些特性是:InheritedValidOn创建自定义属性(续)AttributeUsage属性接受两个参数:创建自定义属性下表列出了AttributeTargets枚举器的各种成员名称。创建自定义属性(续)成员名称属性目标All元素包括汇编、类、类成员、代理、枚举、事件、域、接口、方法、模块、参数、特性或结构Assembly仅汇编Class类的实例ClassMembers类、结构、枚举、构造函数、方法、属性、域、事件、代理和接口Constructor类构造函数DelegateDelegate方法Enum定义的枚举Event定义的事件Field域Interface接口Method定义的方法Module单一模块Parameter方法的参数Property特性(get和set,如果实现的话)Struct结构下表列出了AttributeTargets枚举器的各种成员名命名自定义属性:通常的约定是在属性名称后添加单词Attribute。编译器通过允许你使用名称的简短版本来调用属性以支持添加。创建自定义属性(续)命名自定义属性:创建自定义属性(续)构造自定义属性:每个属性必须包含至少一个构造函数。位置参数通过构造函数被以构造函数中声明的顺序传递,如下面的代码段所示:

publicBugFixingAttribute(intBugNo,string Developer,stringDateFixed) { this.BugNo=BugNo; this.Developer=Developer; this.DateFixed=DateFixed; }创建自定义属性(续)定位参数构造自定义属性:创建自定义属性(续)定位参数创建自定义属性(续)命名参数被实现为特性,如下面的代码段所示:publicstringRemarks{ get{returnRemarks;}set{Remarks=value;}}创建自定义属性(续)命名参数被实现为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论