ImageVerifierCode 换一换
格式:DOC , 页数:7 ,大小:296.50KB ,
资源ID:8989241      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/8989241.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(C#反射机制.doc)为本站上传会员【pc****0】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

C#反射机制.doc

1、C#反射机制 1. 反射机制基础类 1 (1) 反射机制的功能与介绍 1 (2) 反射层次模型图 1 (3) Assembly类获取程序及信息 1 (4) Module类获取程序集模块信息 2 (5) Type类获取类型的信息 2 (6) 利用反射调用方法 3 2. 特性(Attribute) 3 (1) Attribute介绍 3 (2) 示例 3 3. 自定义特性 3 (1) 自定义特性说明 3 (2) 示例 3 (3) AttributeUsage类的使用 4 (4) 可选参数与命名参数 5 (5) Attributes标识符 5 (6) 通过反射获取A

2、ttributes 6 作者:李志伟 时间:2014-02-08 1. 反射机制基础类 (1) 反射机制的功能与介绍 审查元数据并收集关于它的类型信息的能力称为反射。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。System.reflection命名空间包含的几个类,允许用户解析这些元数据表的代码: System.Reflection.Assembly:表示一个程序集。 Syste

3、m.Reflection.Module:在模块上执行反射。 System.Type:表示各种类型。 System.Reflection.MethodBase:提供有关方法和构造函数的信息。 System.Reflection.MethodInfo:发现方法的属性并提供对方法元数据的访问。 System.Reflection.MemberInfo:获取或访问有关成员属性。 System.Reflection.FieldInfo:发现字段属性并提供对字段元数据的访问权。 System.Reflection.PropertyInfo:发现或访问属性(Property)的属性(Attrib

4、ute)。 System.Reflection.EventInfo:发现事件的属性并提供对事件元数据的访问权。 System.Reflection.ConstructorInfo:发现或访问类构造函数的属性。 (2) 反射层次模型图 (3) Assembly类获取程序及信息 class Program { static void Main(string[] args) { Assembly assem = Assembly.Load("mscorlib");//加载系统程序集

5、 PrintInfo(assem);//输出程序集相关信息 assem = Assembly.LoadFrom(@"F:\System.Data.SQLite.dll");//或使用LoadFile()方法 PrintInfo(assem);//输出程序集相关信息 assem = Assembly.GetExecutingAssembly();//获取当前执行代码的程序集 PrintInfo(assem);//输出程序集相关信息 Console.Read();

6、 } //输出程序集相关信息 static void PrintInfo(Assembly assem) { Console.WriteLine("程序集全名:" + assem.FullName); Console.WriteLine("程序集的版本:" + assem.GetName().Version); Console.WriteLine("程序集初始位置:" + assem.CodeBase); Console.Wr

7、iteLine("程序集位置:" + assem.Location); Console.WriteLine("程序集入口:" + assem.EntryPoint); Type[] types = assem.GetTypes();//得到该程序集里所有的类型 Console.WriteLine("程序集下包含的类型数:" + types.Length); //foreach (var item in types) //{ // Co

8、nsole.WriteLine("类:" + item.Name);//输出类型名 //} Console.WriteLine("============================\n"); } } (4) Module类获取程序集模块信息 class Program { static void Main(string[] args) { Assembly assembly = Assembly.Load("mscorlib"

9、);//加载程序集 Module module = assembly.GetModule("CommonLanguageRuntimeLibrary");//得到指定模块 Console.WriteLine("模块名:"+module.Name); Type[] types = module.FindTypes(Module.FilterTypeName, "Assembly*"); foreach (var item in types) {

10、 Console.WriteLine("类名:" + item.Name);//输出类型名 } Console.Read(); } } (5) Type类获取类型的信息 class Myclass { private int Id; public string Name; public void Method(int i) { } } class Program { static v

11、oid Main(string[] args) { Type type = typeof(Myclass); Console.WriteLine("类型名:" + type.Name); Console.WriteLine("类全名:" + type.FullName); Console.WriteLine("命名空间名:" + type.Namespace); Console.WriteLine("程序集名:" + type.Assembly);

12、 Console.WriteLine("模块名:" + type.Module); Console.WriteLine("基类名:" + type.BaseType); Console.WriteLine("是否类:" + type.IsClass); Console.WriteLine("类的公共成员:"); MemberInfo[] memberInfos = type.GetMembers();//得到所有公共成员 foreach (

13、var item in memberInfos) { Console.WriteLine("成员类型:" + item.MemberType + "\t成员:" + item); } Console.Read(); } } (6) 利用反射调用方法 class Myclass { public Myclass() { Console.WriteLine("创建Myclass

14、对象!"); } public void Method(int i) { Console.WriteLine("输出值:" + i); } } class Program { static void Main(string[] args) { Type t = typeof(Myclass);//得到类型 object o = Activator.CreateInstance(t)

15、//创建类型的实例 Console.WriteLine("已创建Myclass对象:" + o); MethodInfo method = t.GetMethod("Method");//获得实例的方法 method.Invoke(o, new object[] { 100 });//调用方法 Console.Read(); } } 2. 特性(Attribute) (1) Attribute介绍 Attributes是一种新的描述信息,我们既可以使用at

16、tributes来定义设计信息(例如:帮助文件,文档的URL),还可以用attributes定义运行时信息(例如,使XML中的元素与类的成员字段关联起来)。我们也可以用attributes来创建一个“自描述”的组件。 (2) 示例 class Program { [Obsolete("已过时的方法!", true)]//把true改成false就可以编译通过 static void OldMethod() { } static void Main(string[] args) {

17、 OldMethod();//调用过时的方法 Console.Read(); } } 在该实例中我们用到了“Obsolete”Attribute,它标记了一个不该再被使用的语言元素(这里的元素为方法),该属性的第一个参数是string类型,它解释为什么该元素被荒弃,以及我们该使用什么元素来代替它。实际中,我们可以书写任何其它文本来代替这段文本。第二个参数是告诉编译器把依然使用这被标识的元素视为一种错误,这就意味着编译器会因此而产生一个警告。 3. 自定义特性 (1) 自定义特性说明 自定义的Attribute类都派生于System.At

18、tribute类。 (2) 示例 //自定义的Attribute类命名为XXXAttribute class HelpAttribute : Attribute { private String description; public HelpAttribute(String Descrition_in) { this.description = Descrition_in; } public String Description

19、 { get { return description; } } } class Program { [Help("自定义特性")]//使用是不需要写“Attribute”后缀 static void Main(string[] args) { Console.Read(); } } 注意:按惯例我们是用”Attribute“作为attribute类名的后缀,然而,当我们当我们把attribute绑定到某语言元素时,是不

20、包含“Attribute“后缀的。编译器首先在System.Attribute 的继承类中查找该attribute,如果没有找到,编译器会把“Attribute“追加到该attribute的名字后面,然后查找它。 (3) AttributeUsage类的使用 AttributeUsage类是另一预定义类(Attribute类本身用System.AttributeUsage类来标记),它将帮助我们控制我们自定义Attribute类的用法,这就是,我们能为自定义的Attribute类定义Attributes属性。它描述了一个自定义Attribute类能被怎样使用。 AttributeUsag

21、e提供三个属性,我们能将它们放置到我们的自定义Attribute类上。 AllowMultiple属性:该值指示能否为一个程序元素指定多个指示属性实例。 Inherited属性:该值指示指示的属性能否由派生类和重写成员继承。 ValidOn属性:获取一组值,这组值标识指示的属性可应用到的程序元素。此属性是AttributeTargets类型的枚举,可取如下值: 使用示例: [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] class HelpAt

22、tribute : Attribute { private String description; public HelpAttribute(String Descrition_in) { this.description = Descrition_in; } public String Description { get { return description; } } } class

23、 Program { [Help("自定义特性")] static void Main(string[] args) { Console.Read(); } } (4) 可选参数与命名参数 可选参数是Attribute类构造函数的参数。它是强制的,必须在每次在Attribute绑定至某语言元素时提供一个值。而另一方面,命名参数倒是真正的可选参数,不是在Attribute构造函数的参数。 [AttributeUsage(AttributeTargets.Method

24、 AllowMultiple = true, Inherited = false)] class HelpAttribute : Attribute { private string _description;//可选参数 public string _name;//命名参数 public HelpAttribute(string description) { Console.WriteLine("HelpAttribute特性被创建!"); thi

25、s._description = description; } public string Description { get { return _description; } } public string Name { get { return _name; } set//命名参数,必须要有set方法 { Console.WriteLine("属性

26、" + value); _name = value; } } } class Program { [Help("自定义特性", Name = "李志伟")]//同时使用可选参数与命名参数 static void Main(string[] args) { Console.Read(); } } (5) Attributes标识符 假设,我们想把HelpAttribute绑定到

27、整个assembly(程序集)。第一个问题是我们要把HelpAttribute放在哪儿才能让编译器确定该Attribute是绑定至整个assembly呢?考虑另一种情况,我们想把Attribute绑定至一个方法的返回类型上,怎样才能让编译器确定我们是把Attribute绑定至方法的返回类型上,而不是整个方法呢? 为了解决诸如此类的含糊问题,我们使用Attribute标识符,有了它的帮助,我们就可以确切地申明我们把attribute 绑定至哪一个语言元素。例如:[assembly: Help("类上的自定义特性", Name = "lizhiwei")]这个在HelpAttribute前的as

28、sembly标识符确切地告诉编译器,该Attribute被绑定至整个assembly(程序集)。可能的标识符有:assembly、module、type、method、property、event、field、param、return。 (6) 通过反射获取Attributes [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = false)] class HelpAttribute : Attribute {

29、 private string _description;//可选参数 private string _name;//命名参数 public HelpAttribute(string description) { Console.WriteLine("====HelpAttribute特性被创建!===="); this._description = description; } public string Description

30、{ get { return _description; } } public string Name { get { return _name; } set//命名参数,必须要有set方法 { Console.WriteLine("====属性:" + value + "===="); _name = value; } }

31、 } //使用了自定义特性的测试类 [Help("类上的自定义特性", Name = "lizhiwei")] class TestClass { [Help("方法上的自定义特性", Name = "李志伟1")] [Help("方法上的自定义特性", Name = "李志伟2")] public void TestMethod() { Console.WriteLine("===========测试方法===========");

32、 } } class Program { static void Main(string[] args) { Type t = typeof(TestClass); //获取类上的自定义特性 object[] obis = t.GetCustomAttributes(typeof(HelpAttribute), false); HelpAttribute attribute = obis[0] as HelpAttribute

33、 Console.WriteLine("\n" + attribute.Description + "--" + attribute.Name + "\n"); //获取方法上的自定义特性 MethodInfo method = t.GetMethod("TestMethod"); object[] methods = method.GetCustomAttributes(typeof(HelpAttribute), false); foreach (HelpAttribute help in methods) { Console.WriteLine("\n" + help.Description + "--" + help.Name + "\n"); } Console.Read(); } }

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服