`
dowhathowtodo
  • 浏览: 780288 次
文章分类
社区版块
存档分类
最新评论

.NET反射入门

 
阅读更多

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方法加载程序集。
下面的程序显示程序集的信息


<!--<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中的反射使用入门

    asp.net教程-.Net中的反射使用入门,收集于网络,觉得不错!

    Visual C#.NET从入门到精通

    第1章 C#入门 第2章 基本C#编程 第3章 表达式与运算符 第4章 判断、循环和预处理指令 第5章 面向对象的编程 第6章 类和对象 第7章 派生类 第8章 接口 第9章 字符串、日期、时间和时间段 第10章 数组和索引器 第11章 ...

    Net中的反射使用入门

    .Net中的反射使用入门, 对.net反射还不太了解的朋友可以下载看看.

    uncapsulator:通过动态代理进行.NET反射的Fluent API

    Uncapsulator为.NET反射提供了一种流畅的API,通过使用实现IDynamicMetaObjectProvider的动态代理,您可以轻松访问对象或类型的私有成员。 当您要动态调用接口的(公共)成员时,解封装器也很有用。 在这种情况下,...

    asp.net知识库

    利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL...

    DLL注入器,用于将.NET程序集注入.NET进程。-.NET开发

    这使您可以在该过程的上下文中运行自己的代码,并允许您使用.NET反射API访问其所有内部状态。 ManagedInjector:syringe:使用ManagedInjector,您可以将.NET程序集注入到其他.NET进程中。 这使您可以在该过程的上下文...

    史上最好传智播客就业班.net培训教程60G 不下会后悔

    常用数据结构(List、Dictionary、Array)、多态、常用设计模式、反射、常用.net类库、泛型、IO流、委托事件、正则表达式、XML、反射、GC等。 2、数据库开发及ADO.Net(6天) 核心技术课程 数据库开发基础、...

    StackExchange开源.Net ORM框架 Dapper.NET.zip

    Dapper原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象。   Dapper.Net的示例代码: public class Dog {  public int? Age { get; set; }  public Guid Id { get; set;...

    C#反射简单入门实例

    创建一个Assembly,反射构造函数,方法,属性信息,动态实例化类对象,调用类方法。对想简单了解反射概念的朋友有一定的帮助。

    Java SE编程入门教程 java反射机制(共16页).pptx

    Java SE编程入门教程 java反射机制(共16页).pptx Java SE编程入门教程 java泛型(共11页).pptx Java SE编程入门教程 java封装继承多态(共56页).pptx Java SE编程入门教程 java集合(共38页).pptx Java SE编程...

    NET环境编程全景

    本书特色:内容涵盖面广,包括了CLR和框架类库、CLR的类型、元数据和执行系统、.NET程序集的联编和部署、.NET语言入门知识(包括C#和VB.NET)等。 目录 第1章 介绍.NET框架 1.1 编程问题 1.2 解决方法 1.3 对比.NET...

    精通.Net核心技术原理与构架

    本书是.NET核心技术的基础入门篇,全书共分19章,随书所附光盘包含书中的全部实例源代码。 本书首先扼要介绍了整体的.NET框架,然后介绍了.NET的基本类库、基本类型的操作,接下来介绍了NET程序设计的核心要素也...

    完整版 Java基础入门教程 Java程序语言设计 07 网络编程 反射机制(共23页).ppt

    完整版 Java基础入门教程 Java程序语言设计 07 网络编程 反射机制(共23页).ppt 完整版 Java基础入门教程 Java程序语言设计 07 网络编程 网络编程(共32页).ppt 完整版 Java基础入门教程 Java程序语言设计 07 网络...

    C#与.NET3.5高级程序设计 part03

    第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第20章 文件输入输出...

    C#与.NET3.5高级程序设计 part02

    第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第20章 文件输入输出...

    C#与.NET3.5高级程序设计 part04

    第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第20章 文件输入输出...

    精通.Net核心技术原理与构架.part1

    本书是.NET核心技术的基础入门篇,全书共分19章,随书所附光盘包含书中的全部实例源代码。 本书首先扼要介绍了整体的.NET框架,然后介绍了.NET的基本类库、基本类型的操作,接下来介绍了NET程序设计的核心要素也...

    精通.Net核心技术原理与构架.part2

    本书是.NET核心技术的基础入门篇,全书共分19章,随书所附光盘包含书中的全部实例源代码。 本书首先扼要介绍了整体的.NET框架,然后介绍了.NET的基本类库、基本类型的操作,接下来介绍了NET程序设计的核心要素也...

    C#与.NET3.5高级程序设计 part18 rar

    第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第20章 文件输入输出...

    C#与.NET3.5高级程序设计 part17 rar

    第15章 .NET程序集入门.pdf 第16章 类型反射、晚期绑定和基于特性的编程.pdf 第17章 进程、应用程序域和对象上下文.pdf 第18章 构建多线程应用程序.pdf 第19章 CIL和动态程序集的作用.pdf 第20章 文件输入输出...

Global site tag (gtag.js) - Google Analytics