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

易探云美国云服务器评测,主机低至33元/月,336元/年

美国服务器哪家平台好?美国服务器无需备案,即开即用,上线快。美国服务器多数带防御,且有时候项目运营的时候,防御能力是用户考虑的重点,特别是网站容易受到攻击的行业。现在有那么多美国一年服务器,哪家的美国云服务器好呢?美国服务器用哪家好?这里推荐易探云,有美国BGP、美国CN2、美国高防、美国GIA等云服务器,线路优化的不错。易探云刚好就是做香港及美国云服务器的主要商家之一,我们来看一下易探云美国云服...

Letbox(35美元/年),美国洛杉矶VPS终身7折

Letbox 云服务商在前面的文章中其实也有多次介绍,这个服务商其实也算是比较老牌的海外服务商,几年前我也一直有使用过他们家的VPS主机,早年那时候低至年付15-35美元左右的VPS算式比较稀缺的。后来由于服务商确实比较多,而且也没有太多的网站需要用到,所以就没有续费,最近这个服务商好像有点活动就躁动的发布希望引起他人注意。这不有看到所谓的家中有喜事,应该是团队中有生宝宝了,所以也有借此来发布一些...

TTcloud(月$70)E3-1270V3 8GB内存 10Mbps带宽 ,日本独立服务器

关于TTCLOUD服务商在今年初的时候有介绍过一次,而且对于他们家的美国圣何塞服务器有过简单的测评,这个服务商主要是提供独立服务器业务的。目前托管硬件已经达到5000台服务器或节点,主要经营圣何塞,洛杉矶以及日本东京三个地区的数据中心业务。这次看到商家有推出了新上架的日本独立服务器促销活动,价格 $70/月起,季付送10Mbps带宽。也可以跟进客户的需求进行各种DIY定制。内存CPU硬盘流量带宽价...

propertyinfo为你推荐
waze马来西亚中文导航waze地图水晶易表如何获取和安装水晶易表Xcelsius2008eagleeye电脑进程中出现Eaglesvr这种程序,据说是一种蠕虫病毒。。。怎样杀掉?视频技术学习短视频需要准备什么?怎么去做呢?12种颜色12种颜色都是代表什么qq网络硬盘如何使用QQ网络硬盘腾讯技术腾讯是什么东西?assemblyinfocsgo很跟cs有什么区别微软操作系统下载怎么下载官方win10 64位镜像系统审计平台什么叫数据库审计系统?
网络星期一 主机屋免费空间 linux空间 刀片服务器是什么 php空间推荐 共享主机 域名和空间 免费全能主机 如何安装服务器系统 彩虹云 美国凤凰城 智能dns解析 国外在线代理服务器 日本代理ip 工信部icp备案查询 带宽测试 深圳主机托管 fatcow 免费网站加速 webmin 更多