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了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。

BlueHost 周年庆典 - 美国/香港虚拟主机 美国SSD VPS低至月32元

我们对于BlueHost主机商还是比较熟悉的,早年我们还是全民使用虚拟主机的时候,大部分的外贸主机都会用到BlueHost无限虚拟主机方案,那时候他们商家只有一款虚拟主机方案。目前,商家国际款和国内款是有差异营销的,BlueHost国内有提供香港、美国、印度和欧洲机房。包括有提供虚拟主机、VPS和独立服务器。现在,BlueHost 商家周年活动,全场五折优惠。我们看看这次的活动有哪些值得选择的。 ...

易探云韩国云服务器仅50元/月,510元/年起

韩国云服务器哪个好?韩国云服务器好用吗?韩国是距离我国很近的一个国家,很多站长用户在考虑国外云服务器时,也会将韩国云服务器列入其中。绝大部分用户都是接触的免备案香港和美国居多,在加上服务器确实不错,所以形成了习惯性依赖。但也有不少用户开始寻找其它的海外免备案云服务器,比如韩国云服务器。下面云服务器网(yuntue.com)就推荐最好用的韩国cn2云服务器,韩国CN2云服务器租用推荐。为什么推荐租用...

CloudCone:$17.99/年KVM-1GB/50GB/1TB/洛杉矶MC机房

CloudCone在月初发了个邮件,表示上新了一个系列VPS主机,采用SSD缓存磁盘,支持下单购买额外的CPU、内存和硬盘资源,最低年付17.99美元起。CloudCone成立于2017年,提供VPS和独立服务器租用,深耕洛杉矶MC机房,最初提供按小时计费随时退回,给自己弄回一大堆中国不能访问的IP,现在已经取消了随时删除了,不过他的VPS主机价格不贵,支持购买额外IP,还支持购买高防IP。下面列...

propertyinfo为你推荐
scheduleatfixedrateJAVA 控制时间腾讯举报中心怎么通过腾讯反诈骗中心举报QQ应用雷达雷达是干什么用的?视频技术视频编辑是干什么的,主要是做一些什么工作呢?这个职位好不好?发展前景怎么样?数据挖掘项目什么是数据挖掘?从事相关的工作有什么要求?腾讯技术腾讯简介----币众筹众筹是什么意思微软操作系统下载怎样在微软官网下载windows7 64位旗舰版上传图片网站求一个可以上传图片外链的网站免费下载空间怎么下载免费的空间播放器
百度域名 过期备案域名查询 美元争夺战 名片模板psd 京东云擎 52测评网 免费申请个人网站 卡巴斯基破解版 万网空间管理 1元域名 cxz 中国域名 群英网络 创速 shuangcheng restart dns是什么意思 瓦工技术 什么是云主机 更多