Reflection,中文翻译为反射。这是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息,例如:Assembly类可以获得正在运行的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类型的实例。Type类可以获得对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调用之。MethodInfo包含方法的信息,通过这个类可以得到方法的名称、参数、返回值等,并且可以调用之。诸如此类,还有FieldInfo、EventInfo等等,这些类都包含在System.Reflection命名空间下。
一、Type类于获取类型信息
System.Type 类对于反射起着核心的作用。当反射请求加载的类型时,公共语言运行库将为它创建一个 Type。您可以使用 Type 对象的方法、字段、属性和嵌套类来查找有关该类型的所有信息。
大家运行一下下面的代码根据结果分析一下就能比较清楚的理解Type了
获取类型信息
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->namespaceConsoleApplication2
{
classProgram
{
staticvoidMain(string[]args)
{
MyClassm=newMyClass();
Typetype=m.GetType();
Console.WriteLine("类型名:"+type.Name);
Console.WriteLine("类全名:"+type.FullName);
Console.WriteLine("命名空间名:"+type.Namespace);
Console.WriteLine("程序集名:"+type.Assembly);
Console.WriteLine("模块名:"+type.Module);
Console.WriteLine("基类名:"+type.BaseType);
Console.WriteLine("是否类:"+type.IsClass);
Console.WriteLine("类的公共成员:");
MemberInfo[]memberInfos=type.GetMembers();//得到所有公共成员
foreach(variteminmemberInfos)
{
Console.WriteLine("{0}:{1}",item.MemberType,item);
}
}
}
classMyClass
{
publicstringm;
publicvoidtest()
{}
publicintMyProperty{get;set;}
}
}
二、获取程序集元数据
Assembly类定义了一个程序集,它是一个可重用、无版本冲突并且可自我描述的公共语言运行库应用程序构造块。因为程序集中是使用元数据进行自我描述的,所以我们就能通过其元数据得到程序集内部的构成。结合Assembly和反射能够获取程序集的元数据,但是首先要将程序集装入内存中。可以使用Assembly类的多种静态Load方法加载程序集。
下面的程序显示程序集的信息
Code:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicstaticvoidMain()
{
//获取当前执行代码的程序集
Assemblyassem=Assembly.GetExecutingAssembly();
Console.WriteLine("程序集全名:"+assem.FullName);
Console.WriteLine("程序集的版本:"+assem.GetName().Version);
Console.WriteLine("程序集初始位置:"+assem.CodeBase);
Console.WriteLine("程序集位置:"+assem.Location);
Console.WriteLine("程序集入口:"+assem.EntryPoint);
Type[]types=assem.GetTypes();
Console.WriteLine("程序集下包含的类型:");
foreach(varitemintypes)
{
Console.WriteLine("类:"+item.Name);
}
}
三、动态加载类型
早绑定是在编译时绑定对象类型,而晚绑定是在运行时才绑定对象的类型。利用反射可以实现晚绑定,即动态加载类型,并调用他们的方法,下边是MSDN中的一个例子,详细的解释信息见注释
动态加载类型
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->namespaceConsoleApplication2
{
publicclassExample
{
privateintfactor;
publicExample(intf)
{
factor=f;
}
publicintSampleMethod(intx)
{
Console.WriteLine("/nExample.SampleMethod({0})executes.",x);
returnx*factor;
}
publicstaticvoidMain()
{
//获取当前执行代码的程序集
Assemblyassem=Assembly.GetExecutingAssembly();
Console.WriteLine("AssemblyFullName:");
Console.WriteLine(assem.FullName);
//TheAssemblyNametypecanbeusedtoparsethefullname.
AssemblyNameassemName=assem.GetName();
Console.WriteLine("/nName:{0}",assemName.Name);
Console.WriteLine("Version:{0}.{1}",
assemName.Version.Major,assemName.Version.Minor);
Console.WriteLine("/nAssemblyCodeBase:");
Console.WriteLine(assem.CodeBase);
//从程序集众创建一个Example实例并且用object类型的引用o指向它,同时调用一个输入参数的构造函数
Objecto=assem.CreateInstance("ConsoleApplication2.Example",false,
BindingFlags.ExactBinding,
null,newObject[]{2},null,null);
//构造Example类的一个晚绑定的方法SampleMethod
MethodInfom=assem.GetType("ConsoleApplication2.Example").GetMethod("SampleMethod");
//调用刚才实例化好的Example对象o中的SampleMethod方法,传入的参数为42
Objectret=m.Invoke(o,newObject[]{42});
Console.WriteLine("SampleMethodreturned{0}.",ret);
Console.WriteLine("/nAssemblyentrypoint:");
Console.WriteLine(assem.EntryPoint);
}
}
分享到:
相关推荐
asp.net教程-.Net中的反射使用入门,收集于网络,觉得不错!
第1章 C#入门 第2章 基本C#编程 第3章 表达式与运算符 第4章 判断、循环和预处理指令 第5章 面向对象的编程 第6章 类和对象 第7章 派生类 第8章 接口 第9章 字符串、日期、时间和时间段 第10章 数组和索引器 第11章 ...
.Net中的反射使用入门, 对.net反射还不太了解的朋友可以下载看看.
Uncapsulator为.NET反射提供了一种流畅的API,通过使用实现IDynamicMetaObjectProvider的动态代理,您可以轻松访问对象或类型的私有成员。 当您要动态调用接口的(公共)成员时,解封装器也很有用。 在这种情况下,...
利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL...
这使您可以在该过程的上下文中运行自己的代码,并允许您使用.NET反射API访问其所有内部状态。 ManagedInjector:syringe:使用ManagedInjector,您可以将.NET程序集注入到其他.NET进程中。 这使您可以在该过程的上下文...
常用数据结构(List、Dictionary、Array)、多态、常用设计模式、反射、常用.net类库、泛型、IO流、委托事件、正则表达式、XML、反射、GC等。 2、数据库开发及ADO.Net(6天) 核心技术课程 数据库开发基础、...
Dapper原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象。 Dapper.Net的示例代码: public class Dog { public int? Age { get; set; } public Guid Id { get; set;...
创建一个Assembly,反射构造函数,方法,属性信息,动态实例化类对象,调用类方法。对想简单了解反射概念的朋友有一定的帮助。
Java SE编程入门教程 java反射机制(共16页).pptx Java SE编程入门教程 java泛型(共11页).pptx Java SE编程入门教程 java封装继承多态(共56页).pptx Java SE编程入门教程 java集合(共38页).pptx Java SE编程...
本书特色:内容涵盖面广,包括了CLR和框架类库、CLR的类型、元数据和执行系统、.NET程序集的联编和部署、.NET语言入门知识(包括C#和VB.NET)等。 目录 第1章 介绍.NET框架 1.1 编程问题 1.2 解决方法 1.3 对比.NET...
本书是.NET核心技术的基础入门篇,全书共分19章,随书所附光盘包含书中的全部实例源代码。 本书首先扼要介绍了整体的.NET框架,然后介绍了.NET的基本类库、基本类型的操作,接下来介绍了NET程序设计的核心要素也...
完整版 Java基础入门教程 Java程序语言设计 07 网络编程 反射机制(共23页).ppt 完整版 Java基础入门教程 Java程序语言设计 07 网络编程 网络编程(共32页).ppt 完整版 Java基础入门教程 Java程序语言设计 07 网络...
第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第20章 文件输入输出...
第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第20章 文件输入输出...
第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第20章 文件输入输出...
本书是.NET核心技术的基础入门篇,全书共分19章,随书所附光盘包含书中的全部实例源代码。 本书首先扼要介绍了整体的.NET框架,然后介绍了.NET的基本类库、基本类型的操作,接下来介绍了NET程序设计的核心要素也...
本书是.NET核心技术的基础入门篇,全书共分19章,随书所附光盘包含书中的全部实例源代码。 本书首先扼要介绍了整体的.NET框架,然后介绍了.NET的基本类库、基本类型的操作,接下来介绍了NET程序设计的核心要素也...
第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第20章 文件输入输出...
第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第20章 文件输入输出...