第十三章属性和反射课件

上传人:文**** 文档编号:241998919 上传时间:2024-08-09 格式:PPT 页数:31 大小:295.39KB
返回 下载 相关 举报
第十三章属性和反射课件_第1页
第1页 / 共31页
第十三章属性和反射课件_第2页
第2页 / 共31页
第十三章属性和反射课件_第3页
第3页 / 共31页
点击查看更多>>
资源描述
第,19,章,Ver.1.0,使用,C#,进行面向对象编程,面向对象编程,属性和反射,面向对象编程属性和反射,在本章,你将学到:,创建自定义属性,使用反射抽取元数据,目标,在本章,你将学到:目标,属性,Attribute,Property,属性Attribute Property,属性,Property,class Employee,private static string _name;,private static string _id;,static void Main(string args),_name=Console.ReadLine();,_id=Console.ReadLine();,直接访问字段,不经验证,属性Propertyclass Employee 直接访问,class Employee,private static string _name;,private static string _id;,public void SetId(value),/,验证输入长度小于,2,if(_id.Length 2),_id=value;,public string GetId(),return _id;,方法,SetId(Value),和,GetId(),分别读取和写入职员,ID,Employee emp;,emp.SetId(A1);,string Department=emp.Get(),每次都调用,GetId(),和,SetId(),方法会很繁琐,属性,class Employee方法 SetId(Value),class Employee,private static string _name;,private static string _id;,public string Id,get,return _id;,set,/,验证输入长度小于,2,if(_id.Length 2),_id=value;,读取,ID,时调用,将值,赋给,ID,时调用,class Employee读取 ID 时调用 将值赋给 I,访问修饰符,数据类型 属性名,get;,set;,读,/,写属性,可以赋值和检索值,访问修饰符 数据类型 属性名读/写属性可以赋值和检索值,访问修饰符,数据类型 属性名,get;,只读属性,只能检索值,访问修饰符 数据类型 属性名只读属性只能检索值,访问修饰符,数据类型 属性名,set;,只写属性,只能赋值,访问修饰符 数据类型 属性名只写属性只能赋值,访问修饰符,static,数据类型 属性名,get;,set;,静态属性,应用于整个类而不是类的实例,只能访问类的静态成员,访问修饰符static 数据类型 属性名静态属性应用于整,class SavingsAccount,/,类字段用于存储帐号、余额和已获利息,private int _accountNumber;,private double _balance;,private double _interestEarned;,/,利率是静态的,因为所有帐户获得的利息相同,private static double _interestRate;,/,构造函数初始化类成员,public SavingsAccount(int accountNumber,double balance),this._accountNumber=accountNumber;,this._balance,=balance;,/,只读,AccountNumber,属性,public int AccountNumber,get,return _accountNumber;,只读,属性,class SavingsAccount只读属性,static void Main(string args),/,创建,SavingsAccount,的对象,SavingsAccount objSavingsAccount=,new SavingsAccount(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);,public double InterestEarned,get,return _interestEarned;,set,/,验证数据,if(value 0.0),Console.WriteLine(“,利息,不能为负数,);,return;,_interestEarned=value;,将设置,InterestEarned,属性,static void Main(string args,static void Main(string args),/,创建,SavingsAccount,的对象,SavingsAccount objSavingsAccount=,new SavingsAccount(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,属性,public static double InterestRate,get,return _interestRate;,set,/,验证数据,if(value 0.0),Console.WriteLine(“,利率不能为负数,);,return;,else,_interestRate=value/100;,static void Main(string args,static void Main(string args),/,创建,SavingsAccount,的对象,SavingsAccount objSavingsAccount=,new SavingsAccount(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,属性,public double Balance,get,if(_balance 0),Console.WriteLine(,没有可用余额,);,return _balance;,static void Main(string args,属性,(Attribute),属性,(Attribute),是一种新型的声明信息。我们可以使用属性来定义设计时的信息,(,比如帮助文件、文档的链接,),,以及运行时的信息,(,比如将一个类的域与一个,XML,的域相关联,),。我们也可以用属性来创建“自描述”的组件,(,可以提供该组件的描述信息,),。,属性(Attribute)属性(Attribut,预定义属性,Conditional,WebMethod,DllImport,Obsolete,自定义属性,属性,(Attribute),预定义属性属性(Attribute),using System;,public class AnyClass,Obsolete(,别用,Old,这个老方法了,请用,New,方法,true),static void Old(),static void New(),public static void Main(),Old();,using System;,.NET,框架允许创建自定义属性,它可以被用于存储信息和在运行时被获取。,这个信息可以与任何目标元素相关,依赖与设计和程序的需要。,为了创建自定义属性,你需要:,定义自定义属性,命名自定义属性,构造自定义属性,为目标元素应用自定义属性,创建自定义属性,.NET框架允许创建自定义属性,它可以被用于存储信息和在运行,定义自定义属性:,一个新自定义属性类来源于,System.Attribute,系统类。,你需要使用预定义的属性应用属性目标到新的自定义属性类,,AttributeUsage,如下面的代码所示:,AttributeUsage(AttributeTargets.Class|,AttributeTargets.Constructor|,AttributeTargets.Field|,AttributeTargets.Method|,AttributeTargets.Property,AllowMultiple=true),创建自定义属性(续),定义自定义属性:创建自定义属性(续),AttributeUsage,属性接受两个参数:,一个参数是表示目标元素的一系列标志。,其他参数是表示一个给定的元素是否被应用于多个这样属性的标志。,除了,AllowMultiple,特性,还有其他特性可以与属性一起使用。这些特性是:,Inherited,ValidOn,创建自定义属性(续),AttributeUsage属性接受两个参数:创建自定义属性,下表列出了,AttributeTargets,枚举器的各种成员名称。,创建自定义属性(续),成员名称,属性目标,All,元素包括汇编、类、类成员、代理、枚举、事件、域、接口、方法、模块、参数、特性或结构,Assembly,仅汇编,Class,类的实例,ClassMembers,类、结构、枚举、构造函数、方法、属性、域、事件、代理和接口,Constructor,类构造函数,Delegate,Delegate,方法,Enum,定义的枚举,Event,定义的事件,Field,域,Interface,接口,Method,定义的方法,Module,单一模块,Parameter,方法的参数,Property,特性,(get,和,set,如果实现的话,),Struct,结构,下表列出了AttributeTargets枚举器的各种成员名,命名自定义属性:,通常的约定是在属性名称后添加单词,Attribute,。,编译器通过允许你使用名称的简短版本来调用属性以支持添加。,创建自定义属性(续),命名自定义属性:创建自定义属性(续),构造自定义属性:,每个属性必须包含至少一个构造函数。,位置参数通过构造函数被以构造函数中声明的顺序传递,如下面的代码段所示:,public BugFixingAttribute(int BugNo,string Developer,string DateFixed),this.BugNo=BugNo;,this.Developer=Developer;,this.DateFixed=DateFixed;,创建自定义属性(续),定位参数,构造自定义属性:创建自定义属性(续)定位参数,创建自定义属性(续),命名参数被实现为特性,如下面的代码段所示:,public string Remarks,get,return Remarks;,set,Remarks=value;,创建自定义属性(续)命名参数被实现为特性,如下面的代码段所示,为位置参数创建只读属性是很常见的:,public int BugNo,get,return BugNo;,创建自定义属性(续),为位置参数创建只读属性是很常见的:创建自定义属性(续),创建自定义属性(续),应用自定义属性:,属性可以通过将它立刻放置在它的目标之前被应用。,为了测试上述例子的,BugFixAttribute,属性,你可以创建一个简单的名为,Calculator,类的程序,给出四个函数。,你需要指定,BugFixAttribute,为目标元素类以记录它的代码维护历史,如下面的代码所示:,BugFixingAttribute(125,Sara Levo,08/15/06,Remarks=Return object not specified),BugFixingAttribute(159,Sara Levo,08/17/06,Remarks=Data Type Mismatch),创建自定义属性(续)应用自定义属性:,AttributeUsage(AttributeTargets.All,AllowMultiple=false,Inherited=false),public class HelpAttribute:Attribute,public HelpAttribute(String Description_in),this.description=Description_in;,protected String description;,public String Description,get,return this.description;,Help(this is a do-nothing class),public class AnyClass,Help(this is a do-nothing method)/error,public void AnyMethod(),AttributeUsage(AttributeTarge,使用反射抽取元数据,反射在运行时被使用在获得类型信息的过程中。,提供访问运行程序的元数据的类时在,System.Reflection,命名空间中。,System.Reflection,命名空间包含允许程序员获取关于运行的程序的信息的类,以动态的添加类型、值和对象到那个程序。,使用反射抽取元数据反射在运行时被使用在获得类型信息的过程中。,使用反射抽取元数据(续),反射通常用于下面的任务:,浏览元数据,完成类型发现,方法和特性的后期绑定,反射发出,使用反射抽取元数据(续)反射通常用于下面的任务:,使用反射抽取元数据(续),浏览元数据:,为了使用反射来浏览元数据,,System.Reflection,命名空间的,MemberInfo,对象需要被实例化。,这个对象有助于发现成员的属性并且提供对元数据的访问。,使用反射抽取元数据(续)浏览元数据:,在本章中,你已经学到:,自定义属性是你根据需要创建的属性。,你添加属性的元素被称为属性目标。,反射在运行时获取类型信息的过程中被使用。,反射通常用于完成如下任务:,浏览元数据,完成类型发现,方法和属性的后期绑定,反射发出,小结,在本章中,你已经学到:小结,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!