propertyinfoC#怎么使用反射获取事件的响应方法

propertyinfo  时间:2021-06-08  阅读:()

有关C# 映射的详解

我们知道,C#编译后的PE文件主要由IL代码和元数据组成,元数据为.NET组件提供了丰富的自描述特性,它使得我们可以在代码运行时获知组件中的类型等重要的信息。

在C#中这是通过一种称作映射(Reflection)的机制来完成的。

先来看一个示例,我们首先创建一个简单的类型: // SimpleType.cs public class MyClass { private int count=100; public int Count { get{ return count; } set{ count=value; } } public void Print() { System.Console.WriteLine(count);} } 用编译命令csc /t:library SimpleType.cs编译上面的文件得到SimpleType.dll输出。

我们再来实现查询类型的测试程序: //Test.cs using System; using System.Reflection; class Test { public static void Main(string[] args) { Type t = typeof(MyClass);//获取MyClass的类型信息 Console.WriteLine("The Type Name : {0}",t.Name);//获取类型的名字 FieldInfo[] fiArr=t.GetFields();//获取所有的共有域 Console.Write("The {0} Fields :",fiArr.Length); foreach(FieldInfo o in fiArr) { Console.Write(o.Name+" "); } Console.WriteLine(); PropertyInfo[] piArr=t.GetProperties();//获取所有的公有属性 Console.Write("The {0} Properties :",piArr.Length); foreach(PropertyInfo o in piArr) { Console.Write(o.Name+" "); } Console.WriteLine(); MethodInfo[] miArr=t.GetMethods();//获取所有的公有方法 Console.Write("The {0} Methods :",miArr.Length); foreach(MethodInfo o in miArr) { Console.Write(o.Name+" "); } } } 用编译命令csc /r:simpletype.dll test.cs编译后,执行可得到下面的输出: The Type Name : MyClass The 0 Fields : The 1 Properties :Count The 7 Methods :GetHashCode Equals ToString get_Count set_Count Print GetType 在上面的例子中,我们首先通过 typeof(MyClass)获得类MyClass的类型信息,当然我们也可以通过创建对象实例,然后调用对象实例的GetType方法来获得(每个类都从object根类中继承获得此方法)。

在拥有了类型信息(变量t)后,我们便可以获得其类型的名字,该类型含有的公有域,公有属性,公有方法。

注意这里C#的映射机制只允许我们获取类型的公有信息,这符合面向对象的封装的原则。

这也是为什么我们虽然我们实现了count域,查询类型得到的输出却是“The 0 Fields :”——如果将SimpleType.cs中的count域改为public公有,我们将会得到他的查询信息。

其中4个方法(GetHashCode Equals ToString GetType)都是继承自object类的公有方法,而方法get_Count 和set_Count则是我们在实现Count属性的“副产物”——这符合我们前面讲述的属性本质上为方法的变体。

实际上,System.Type类各种各样的成员使得我们能够获得几乎所有的与类型相关的公有信息。

在System.Reflection命名空间下的各个类更是可以获得各个编程元素更较详细的信息,如方法的参数与返回值,域的类型,枚举的各个值等。

动态创建与调用 实际上映射还远远不止于动态地获知组件的类型信息,它还能使我们在获得类型信息的基础上,在代码运行时进行类型的动态创建与方法的动态调用,甚至于动态地创建并执行IL代码! 动态调用为C#的组件提供了晚绑定功能,它使得组件之间在运行时的集成变得极为方便!利用前面创建的简单的组件SimpleType.dll,我们来看一看怎样完成对象的动态创建和方法的动态调用: // DynamicExe.cs using System; using System.Reflection; class Test { public static void Main() { Assembly a=Assembly.LoadFrom("SimpleType.dll");//装载组件 foreach(Type t in a.GetTypes()) { if(t.IsClass && !t.IsAbstract) { MethodInfo[] miArr=t.GetMethods();//获得类型的公有方法 object o=Activator.CreateInstance(t);//创建实例(无参构造器) foreach(MethodInfo mi in miArr) { if(!mi.IsAbstract && !mi.IsStatic && mi.GetParameters().Length==0) { object re=mi.Invoke(o,null);//调用实例方法 Console.WriteLine("{0} , Return :{1}",mi.Name,re); } } } } } } 用编译命令csc /r:simpletype.dll dynamicexe.cs编译后,执行可得到下面的输出: GetHashCode , Return :8 ToString , Return :MyClass get_Count , Return :100 100 Print , Return : GetType , Return :MyClass 我们在上面的例子给出了被动态调用的方法的名字和返回值。

其中输出的第4行为100,它是我们动态调用方法MyClass.Print() 的输出。

需要指出的是我们通过一定的控制,仅仅调用的是类型的公有的无参数的实例方法。

给出组件的名字,运用Assembly.LoadFrom我们便可以动态的装载组件。

Activator.CreateInstance允许动态地创建类型(我们这里只通过无参的构造器来创建),实际上用它创建出来的类型和我们用MyClass o=new MyClass()创建出来的类型一模一样。

进而,我们便可以在查询到的成员的基础上,对它们进行动态调用。

Microsoft.NET从底层的元数据设计入手,为映射机制提供了非常坚实的基础。

命名空间System.Reflection和System.Reflection.Emit为操作这种映射提供了实实在在的强大的API编程接口,大大改善了组件的设计环境,提高了组件的交互能力!

如何使用PropertyInfo GetValue

Response.Write(info.GetValue(Item,null));//这样写。



多看看反射。



这是最简单的应用了。

C#怎么使用反射获取事件的响应方法

首先,请您先理解一下反射的基本原理.否则我下述的代码您可能有点摸不着头脑. 反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类、结构、委托、接口和枚举等)的成员和成员的信息。

有了反射,即可对每一个类型了如指掌。

另外还可以直接创建对象,即使这个对象的类型在编译时还不知道。

反射的基本过程如下,请您务必阅读.完毕后我将给你写出对应的代码. (1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。

(2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。

(3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。

(4)使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。

(5)使用FiedInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。

(6)使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。

(7)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。

(8)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。

提速啦:美国多IP站群云服务器 8核8G 10M带宽 7IP 88元/月

提速啦(www.tisula.com)是赣州王成璟网络科技有限公司旗下云服务器品牌,目前拥有在籍员工40人左右,社保在籍员工30人+,是正规的国内拥有IDC ICP ISP CDN 云牌照资质商家,2018-2021年连续4年获得CTG机房顶级金牌代理商荣誉 2021年赣州市于都县创业大赛三等奖,2020年于都电子商务示范企业,2021年于都县电子商务融合推广大使。资源优势介绍:Ceranetwo...

妮妮云(119元/季)日本CN2 2核2G 30M 119元/季

妮妮云的知名度应该也不用多介绍了,妮妮云旗下的云产品提供商,相比起他家其他的产品,云产品还是非常良心的,经常出了一些优惠活动,前段时间的八折活动推出了很多优质产品,近期商家秒杀活动又上线了,秒杀产品比较全面,除了ECS和轻量云,还有一些免费空间、增值代购、云数据库等,如果你是刚入行安稳做站的朋友,可以先入手一个119/元季付的ECS来起步,非常稳定。官网地址:www.niniyun.com活动专区...

妮妮云,美国cera CN2线路,VPS享3折优惠

近期联通CUVIP的线路(AS4837线路)非常火热,妮妮云也推出了这类线路的套餐以及优惠,目前到国内优质线路排行大致如下:电信CN2 GIA>联通AS9929>联通AS4837>电信CN2 GT>普通线路,AS4837线路比起前两的优势就是带宽比较大,相对便宜一些,所以大家才能看到这个线路的带宽都非常高。妮妮云互联目前云服务器开放抽奖活动,每天开通前10台享3折优惠,另外...

propertyinfo为你推荐
scheduleatfixedrate运用Executors.newScheduledThreadPool的任务调度怎么解决知识分享平台微信看到一些文章,可以分享到知识付费的平台吗?怎么操作呀?vga接口定义主板VGA接口两排针脚的循序是怎么排列防火墙排名目前比较好的防火墙软件有哪些?熊猫烧香病毒下载谁知道熊猫烧香病毒天翼校园宽带天翼校园宽带 是怎么算时间的 一个月 是指从办理那天开始 往后 30天是一个月吗 还是 办理的那天所在的那个papertiger亚瑟士 艾斯克斯 tiger有什么区别吗超级播放器那种电影网站就是那种不需要下载播放器可以直接看鸿道集团加多宝和王老吉是一个老总吗?黑客技术学习想学一些黑客技术,需要学习什么知识,以及安装哪些软件?
广东vps 本网站服务器在美国维护 免备案cdn 表单样式 xen vip购优汇 刀片服务器的优势 已备案删除域名 电信主机 美国独立日 空间登录首页 我的世界服务器ip 论坛主机 全能空间 杭州电信宽带优惠 购买空间 阵亡将士纪念日 买空间网 服务器硬件配置 好看的空间 更多