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

Contabo美国独立日促销,独立服7月€3.99/月

Contabo自4月份在新加坡增设数据中心以后,这才短短的过去不到3个月,现在同时新增了美国纽约和西雅图数据中心。可见Contabo加速了全球布局,目前可选的数据中心包括:德国本土、美国东部(纽约)、美国西部(西雅图)、美国中部(圣路易斯)和亚洲的新加坡数据中心。为了庆祝美国独立日和新增数据中心,自7月4日开始,购买美国地区的VPS、VDS和独立服务器均免设置费。Contabo是德国的老牌服务商,...

IonSwitch:$1.75/月KVM-1GB/10G SSD/1TB/爱达荷州

IonSwitch是一家2016年成立的国外VPS主机商,部落上一次分享的信息还停留在2019年,主机商提供基于KVM架构的VPS产品,数据中心之前在美国西雅图,目前是美国爱达荷州科德阿伦(美国西北部,西接华盛顿州和俄勒冈州),为新建的自营数据中心。商家针对新数据中心运行及4号独立日提供了一个5折优惠码,优惠后最低1GB内存套餐每月仅1.75美元起。下面列出部分套餐配置信息。CPU:1core内存...

AlphaVPS(€3.99/月)VPS年付15欧,AMD EYPC+NVMe系列起

AlphaVPS是一家保加利亚本土主机商(DA International Group Ltd),提供VPS主机及独立服务器租用等,数据中心包括美国(洛杉矶/纽约)、德国、英国和保加利亚等,公司办公地点跟他们提供的保加利亚数据中心在一栋楼内,自有硬件,提供IPv4+IPv6,支持PayPal或者信用卡等方式付款。商家提供的大硬盘VPS主机,提供128GB-2TB磁盘,最低年付15欧元起,也可以选择...

propertyinfo为你推荐
知识分享平台知识付费平台有哪些?chrome系统Chrome OS是什么系统?jstz谁有101网校的账号?kjava谁能告诉我KJAVA是什么意思和普通的JAVA程序有什么区别?移动硬盘文件或目录损坏且无法读取急:移动硬盘无法访问,打开提示”文件或目录损坏且无法读取”微信网页版怎么看朋友圈电脑版微信怎么看朋友圈和发朋友圈电子邮件软件电子邮件软件哪个好用什么是网络地址请问电脑显示正在获取网络地址是什么意思怎么办免费下载空间怎么下载免费的空间播放器免费下载空间要下载免费空间播放器怎么弄
到期域名查询 汉邦高科域名申请 vps.net uk2 128m内存 patcha ibrs godaddy域名证书 php空间申请 腾讯云分析 国外免费asp空间 流媒体加速 网购分享 智能dns解析 阿里云邮箱登陆 稳定空间 阿里云邮箱申请 重庆服务器 电信主机托管 碳云 更多