欢迎来到天天文库
浏览记录
ID:16285254
大小:21.53 KB
页数:4页
时间:2018-08-08
《c# 通过反射获取类的字段值》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、FieldInfo..::.GetValue方法在派生类中被重写时,返回给定对象支持的字段的值。命名空间: System.Reflection程序集: mscorlib(在mscorlib.dll中)如果该字段是静态的,则忽略obj。对于非静态字段,obj应是继承或声明该字段的类的实例。请注意,GetValue的返回类型为Object。例如,如果此字段包含一个Boolean基元值,则返回带有相应Boolean值的Object的实例。在返回该值以前,GetValue将检查用户是否有访问权限。静态字段:obj.GetType
2、().GetField(字段名).GetValue(null);实例非静态字段:typeof(类名).GetField(字段名,BindingFlags标识).GetValue(对象实例变量);示例:获取静态字段的值classMyClass{publicstaticStringval="test";publicstaticvoidMain(){FieldInfomyf=typeof(MyClass).GetField("val");Console.WriteLine(myf.GetValue(null));val="hi
3、";Console.WriteLine(myf.GetValue(null));}}示例:获取对象实例的字段值publicclassMyClass{publicstringmyFieldA;publicstringmyFieldB;publicMyClass(){myFieldA="Apublicfield";myFieldB="Anotherpublicfield";}}publicclassFieldInfo_GetValue{publicstaticvoidMain(){MyClassmyInstance=newM
4、yClass();TypemyType=typeof(MyClass);try{//GettheFieldInfoofMyClass.FieldInfo[]myFields=myType.GetFields(BindingFlags.PublicBindingFlags.Instance);Console.WriteLine("显示{0}类型实例各字段的值.",myType);for(inti=0;i5、{1}",myFields[i].Name,myFields[i].GetValue(myInstance));}}catch(Exceptione){Console.WriteLine("Exception:{0}",e.Message);}}}下面举一个很实用的例子有一个控件对象,它拥有Click事件,用户给Click事件添加了事件响应函数(EventHandler)。现在需要用一个扩展的自定义控件来通过代码方式动态替换现有控件。这样,即需要将原控件的事件处理函数复制过来。而事件对象不能被复制,只能通过反射的方式来实6、现。深入分析:控件的Click事件定义方式可能如下。其中Events为EventHandlerList类型的集合对象,用来存储所有事件(在System.ComponentModel.Component中定义)。EventClick为object类型的对象,作为区分各类Event的key。订阅和取消事件的实现方式如下publiceventEventHandlerClick{add{base.Events.AddHandler(EventClick,value);}remove{base.Events.RemoveHandl7、er(EventClick,value);}}EventClick定义如下internalstaticreadonlyobjectEventClick;EventHandlerList类中有一个特殊的方法:Find,定义如下publicsealedclassEventHandlerList:...{...privateListEntryFind(objectkey);...privatesealedclassListEntry{...internalDelegatehandler;...}}实际上,我们可以按如下方式获得8、EventHandlercontrol.Events.Find(control.EventClick).handler然后,由于封装的原因,我们无法直接执行如上调用。因此,反射发挥作用了:varhandler=(EventHandler)GetDelegate(toolStripButton,"EventClick"
5、{1}",myFields[i].Name,myFields[i].GetValue(myInstance));}}catch(Exceptione){Console.WriteLine("Exception:{0}",e.Message);}}}下面举一个很实用的例子有一个控件对象,它拥有Click事件,用户给Click事件添加了事件响应函数(EventHandler)。现在需要用一个扩展的自定义控件来通过代码方式动态替换现有控件。这样,即需要将原控件的事件处理函数复制过来。而事件对象不能被复制,只能通过反射的方式来实
6、现。深入分析:控件的Click事件定义方式可能如下。其中Events为EventHandlerList类型的集合对象,用来存储所有事件(在System.ComponentModel.Component中定义)。EventClick为object类型的对象,作为区分各类Event的key。订阅和取消事件的实现方式如下publiceventEventHandlerClick{add{base.Events.AddHandler(EventClick,value);}remove{base.Events.RemoveHandl
7、er(EventClick,value);}}EventClick定义如下internalstaticreadonlyobjectEventClick;EventHandlerList类中有一个特殊的方法:Find,定义如下publicsealedclassEventHandlerList:...{...privateListEntryFind(objectkey);...privatesealedclassListEntry{...internalDelegatehandler;...}}实际上,我们可以按如下方式获得
8、EventHandlercontrol.Events.Find(control.EventClick).handler然后,由于封装的原因,我们无法直接执行如上调用。因此,反射发挥作用了:varhandler=(EventHandler)GetDelegate(toolStripButton,"EventClick"
此文档下载收益归作者所有