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

日本CN2、香港CTG(150元/月) E5 2650 16G内存 20M CN2带宽 1T硬盘

提速啦简单介绍下提速啦 是成立于2012年的IDC老兵 长期以来是很多入门级IDC用户的必选商家 便宜 稳定 廉价 是你创业分销的不二之选,目前市场上很多的商家都是从提速啦拿货然后去分销的。提速啦最新物理机活动 爆炸便宜的香港CN2物理服务器 和 日本CN2物理服务器香港CTG E5 2650 16G内存 20M CN2带宽 1T硬盘 150元/月日本CN2 E5 2650 16G内存 20M C...

美国cera机房 2核4G 19.9元/月 宿主机 E5 2696v2x2 512G

美国特价云服务器 2核4G 19.9元杭州王小玉网络科技有限公司成立于2020是拥有IDC ISP资质的正规公司,这次推荐的美国云服务器也是商家主打产品,有点在于稳定 速度 数据安全。企业级数据安全保障,支持异地灾备,数据安全系数达到了100%安全级别,是国内唯一一家美国云服务器拥有这个安全级别的商家。E5 2696v2x2 2核 4G内存 20G系统盘 10G数据盘 20M带宽 100G流量 1...

如何低价香港服务器购买?有没有便宜的香港服务器推荐?

如何低价香港服务器购买?想要做一个个人博客,想用香港服务器,避免繁琐备案,性能不需要多高,只是记录一些日常而已,也没啥视频之类的东西,想问问各位大佬有没有低价的香港服务器推荐?香港距大陆近,相比美国服务器最大的优势在于延迟低,ping值低,但是带宽紧张,普遍都是1M,一般戏称其为“毛细血管”。同时价格普遍高,优质稳定的一般价格不菲。大厂云梯队阿里云、腾讯云两家都有香港服务器,要注意的是尽量不要选择...

propertyinfo为你推荐
iso20000认证iso20000认证流程是怎样的知识分享平台微信看到一些文章,可以分享到知识付费的平台吗?怎么操作呀?y码男生衣服M L XL分别是什么码?华为总裁女儿为啥姓孟任正非女儿为什么姓孟?网络审计什么叫网络会计师事务所扫图高清扫图是什么意思,在很多的贴吧里,都有提到一些高清扫图,是自己照杂志上的图片,然后自己再修一下吗搜索引擎的概念7 什么是搜索引擎?如何在Internet上搜索图片和文字资料的?什么是生态系统生态系统的我主要特征是什么?xcelsius谁有水晶易表2008的密钥?河北云办税厅河北省商务厅的人员编制
免费网站域名申请 草根过期域名 淘宝抢红包攻略 plesk 5折 softlayer 外国服务器 云图标 绍兴高防 免费个人空间申请 699美元 cdn加速原理 百度云1t 申请免费空间和域名 西安服务器托管 中国linux lamp架构 免备案cdn加速 卡巴斯基官网下载 网络速度 更多