原帖地址:http://www.cnblogs.com/lazycoding/archive/2013/05/27/3100932.html
反射
当我们需要检查,调用一个程序集的内容的时候,用反射,比如,当VS给智能提示的时候,就应用了反射。
简单用法实例:
var myAssembly = Assembly.LoadFile(@"C:\ClassLibrary1.dll");
var myType = myAssembly.GetType("ClassLibrary1.Class1");
dynamic objMyClass = Activator.CreateInstance(myType);
// 获取类的类型信息
Type parameterType = objMyClass.GetType();
// 浏览方法
foreach (MemberInfo objMemberInfo in parameterType.GetMembers())
{Console.WriteLine(objMemberInfo.Name);}
// 浏览属性.
foreach (PropertyInfo objPropertyInfo in parameterType.GetProperties())
{Console.WriteLine(objPropertyInfo.Name);}
//开始调用
parameterType.InvokeMember("Display",BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.InvokeMethod |
BindingFlags.Instance,null, objMyClass, null);
实际一点的用处呢:
1.当你也要开发一个类似VS的编辑器的时候,要提供智能提示就需要反射
2.当创建单元测试框架的时候,为了测试需要动态调用方法和属性的时候
3.有时候我们想把类型的属性,方法等全部导出的时候
动态dynamic
编程语言分为强/弱类型,dynamic是弱类型,此关键字会让编译器不做编译时的类型检查,只做运行时的检查。
所以上面这行代码可以编译通过,但会产生运行时一场。
实际用处:
最多的就是通过互操作来操作Office组件的时候了
没有dynamic的时候
/ Before the introduction of dynamic.
Application excelApplication = new Application();
((Excel.Range)excelApp.Cells[1, 1]).Value2 = "Name";
Excel.Range range2008 = (Excel.Range)excelApp.Cells[1, 1];
有了dynamic之后世界就不一样了
dynamic excelApp = new Application();
excelApp.Cells[1, 1].Value = "Name";
Excel.Range range2010 = excelApp.Cells[1, 1];
两者的区别和联系呢
1.当我们想要在运行时操作一个对象的时候,就会用到这两个
2.反射可以用来检测对象的元数据,也能在运行时调用对象的方法和属性
3.dynamic是.net 4.0新出的关键字,知道方法被调用的时候,编译器才会晓得这个方法到底有还是没有。
4.dynamic内部是使用反射来实现的,它缓存了方法调用来提高性能
5.反射可以调用公有和私有成员,而dynamic智能调用用公有成员
6.dynamic是实例相关的,无法访问静态成员,这种情况下使用反射吧。
|
Reflection |
Dynamic |
Inspect (meta-data) |
Yes |
No |
Invoke public members |
Yes |
Yes |
Invoke private members |
Yes |
No |
Caching |
No |
Yes |
Static class |
Yes |
No |
再来一张图...
本文链接
分享到:
相关推荐
Java反射(Reflection)和动态代理(Dynamic Proxy)是Java编程中的高级特性,它们为程序提供了强大的功能和灵活性。本文将深入探讨这两个主题,并通过源码分析来加深理解。 首先,让我们了解一下Java反射。反射机制...
C#反射(Reflection)是.NET框架提供的一种强大的元数据访问机制,它允许程序在运行时检查自身的行为和属性。在C#中,反射允许我们动态地创建对象、获取类型信息、调用方法、访问字段和属性,以及遍历类型的继承层次...
Java 反射(Reflection)是Java编程语言的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、方法、字段等)并直接操作对象的内部属性。这为开发者提供了强大的灵活性,能够在不预先知道具体类的情况下...
在.NET编程环境中,C#反射是一项强大的特性,它允许程序在运行时检查自身,并能动态地创建对象、调用方法和访问属性。本实例代码主要探讨如何通过接口方式利用反射来动态加载DLL文件,这对于模块化开发和插件式架构...
Java反射和动态代理是Java语言中的两个重要特性,它们为程序提供了强大的运行时能力,能够增强软件的灵活性和可扩展性。这篇博文将深入探讨这两个主题,并通过实例解析其核心概念。 **Java反射(Reflection)** ...
在Java编程语言中,反射(Reflection)和动态代理(Dynamic Proxy)是两个强大的特性,它们为程序员提供了在运行时检查和操作类、接口、对象的能力。这篇内容将深入讲解这两个概念,帮助初学者理解并掌握它们的应用...
Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行上发挥着关键作用。本文将深入探讨这两个概念,以及如何在实际开发中利用它们。 首先,我们来理解Java反射(Reflection)。Java反射...
3. **反射和折射(Reflection & Refraction)**: 水面的反射和折射效果是通过捕获周围环境的镜像并扭曲显示来实现的。Unity3D可以通过Render Texture来捕捉场景的反射,然后在水面着色器中应用这一反射纹理。折射...
在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作对象的内部属性和行为。反射机制使得我们能够在运行时动态地获取类的信息,并且能够创建对象、调用方法、访问字段,甚至改变类...
Reflection.zip文件中的ConsoleApp1示例可能是用来演示如何使用反射来实现动态代码执行和元数据探索。让我们深入探讨Reflection的核心概念和应用。 1. **什么是反射?** 反射是.NET框架提供的一种机制,它允许程序...
通过System.Reflection命名空间中的类,如Assembly、Type、MethodInfo、ConstructorInfo等,我们可以动态地创建对象、调用方法、访问属性和字段。 2. 动态调用DLL方法: DLL(Dynamic Link Library)是Windows操作...
在.NET框架中,C#的反射机制是一种强大的工具,它允许程序在运行时发现和使用...通过熟练掌握反射,开发者可以构建出更加动态和模块化的应用程序。在进行反射编程时,理解其原理、谨慎使用以及充分测试是至关重要的。
7. **动态代理(Dynamic Proxy)**:Java反射提供了一种创建动态代理类的机制,通过实现InvocationHandler接口,可以在运行时拦截并处理方法调用。 8. **安全性与性能**:尽管反射强大,但过度使用可能导致安全风险...
在C#编程语言中,`dynamic`关键字和反射(Reflection)都是用于在运行时执行操作的强大工具,但它们在使用场景和性能上有所不同。本文将深入探讨`dynamic`如何比反射更快,并解释其背后的工作原理。 首先,`dynamic...
在Java编程语言中,反射、动态代理和注解是三个重要的高级特性,它们极大地扩展了Java的灵活性和可扩展性。下面将详细讲解这三个概念及其应用。 **反射(Reflection)** 反射是Java提供的一种能力,允许程序在运行时...
在Java编程语言中,反射(Reflection)和动态代理(Dynamic Proxy)是两个强大的特性,它们极大地增强了代码的灵活性和可扩展性。反射允许程序在运行时检查类、接口、字段和方法的信息,并能够动态地创建对象和调用...
在编程世界中,抽象类、反射、动态绑定和接口是面向对象编程的重要概念,它们各自在不同的场景下发挥着关键作用。以下是对这些概念的详细解释: **抽象类(Abstract Class)** 抽象类是不能被实例化的类,它通常...
在Java编程中,反射和动态代理是两个非常重要的高级特性,它们为程序提供了更大的灵活性和扩展性。这篇学习笔记主要关注动态代理部分,虽然没有提供具体的压缩包文件内容,但根据标题和描述,我们可以深入探讨这两个...
动态加载APK的核心技术主要包括类加载器(ClassLoader)的重写、 Dex优化(DexOpt)和反射(Reflection)等。类加载器是Java虚拟机加载类的关键组件,通过重写其行为,我们可以使得系统在运行时识别并加载外部的APK...
反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间。 1、假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): Assembly assembly = Assembly.LoadFile(程序集路径,不能是...