反射主要用于在程序运行期间动态解析相关类的类名,命名空间,属性,方法并进行相应操作,以下通过两个简单的例子进行了说明:

示例1:调用程序集内部方法,运行时动态获取相关类的信息,包括类名,命名空间等信息并进行对象的创建及方法的调用:

测试类:

class HI
{
public string Hi = "HelloWorld"; public string SayHello_CI()
{
return "Hello World!";
} public string SayHello_AC()
{
return "How are you!";
}
}

调用类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Remoting;
using System.Text;
using System.Threading.Tasks; namespace ReflectionLearning01
{
class Program
{
static void Main(string[] args)
{
Type type = typeof(HI); //Create object using Assembly
Assembly Assem = type.Assembly;
Object objAssembly = Assem.CreateInstance("ReflectionLearning01.HI", true); //Creare object using Activator
ObjectHandle handler = Activator.CreateInstance(null, "ReflectionLearning01.HI");
Object objActvator = handler.Unwrap(); //Call the function in another class
string res_ci = (string)type.InvokeMember("SayHello_CI", BindingFlags.InvokeMethod, null, objAssembly, null);
string res_ac = (string)type.InvokeMember("SayHello_AC", BindingFlags.InvokeMethod, null, objActvator, null); string Name = type.Name;
string FullName = type.FullName;
string NameSpace = type.Namespace;
var Assembly = type.Assembly;
var Module = type.Module; Console.WriteLine("ClassName:" + Name);
Console.WriteLine("ClassFullName:" + FullName);
Console.WriteLine("NameSpace:" + NameSpace);
Console.WriteLine("Assembly:" + Assembly);
Console.WriteLine("Module:" + Module); Console.WriteLine(res_ci);
Console.WriteLine(res_ac);
Console.ReadLine(); }
}
}

运行结果:

示例2:在当前程序集内部调用外部程序集即动态加载DLL,调用其中的方法并返回方法返回值:

新建类库项目HelloWorld,新增类的详细代码如下,生成.dll:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace HelloWorld
{
public class HI
{
public string SayHello(string Hi)
{
return Hi+", current time is "+DateTime.Now.ToShortDateString()+",It's time to go home!";
}
}
}

新建类Windows 控制台程序ReflectionLearning,类的调用信息如下:

PS.不需要添加HelloWorld.dll到当前项目的引用中

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Remoting;
using System.Text;
using System.Threading.Tasks; namespace ReflectionLearning01
{
class Program
{
static void Main(string[] args)
{
Assembly assembly = System.Reflection.Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "HelloWorld.dll");
Type type = assembly.GetType("HelloWorld.HI");
object instance = assembly.CreateInstance("HelloWorld.HI"); //Parameter list
Type[] ParmType = new Type[];
ParmType[] = Type.GetType("System.String");
Object[] parm_obj = new Object[];
parm_obj[] = "HelloWorld!"; object result = type.GetMethod("SayHello", ParmType).Invoke(instance, parm_obj); Console.WriteLine(result);
Console.ReadLine(); }
}
}

拷贝HelloWorld.dll到当前项目,并F5运行,调用成功后的信息如下所示:

到此,两个演示的例子已经完成,希望通过不断的使用,我们都能不断提高!

反射(Reflection)的更多相关文章

  1. [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦

    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...

  2. [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程

    [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...

  3. [整理]C#反射(Reflection)详解

    本人理解: 装配件:Assembly(程序集) 晚绑定:后期绑定 MSDN:反射(C# 编程指南) -----------------原文如下-------- 1. 什么是反射2. 命名空间与装配件的 ...

  4. CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction)

    CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction) 开始 如图所示,本文围绕GLSL里的sam ...

  5. 代理(Proxy)和反射(Reflection)

    前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了O ...

  6. Golang 反射reflection

    反射reflection 反射可大大提高程序的灵活性,使得interface{}有更大的发挥余地 反射使用TypeOf和ValueOf函数从接口中获取目标对象信息 反射会将匿名字段作为独立字段(匿名字 ...

  7. C# 反射(Reflection)技术

    本文参考自C#反射(Reflection)详解,纯属学习笔记,加深记忆 在介绍反射前,先介绍一个重要的知识点         .Net应用程序是由程序集(Assembly).模块(Module).类型 ...

  8. C#反射(Reflection)详解

    1. 什么是反射2. 命名空间与装配件的关系3. 运行期得到类型信息有什么用4. 如何使用反射获取类型5. 如何根据类型来动态创建对象6. 如何获取方法以及动态调用方法7. 动态创建委托 1.什么是反 ...

  9. C# 反射Reflection——反射反射程序员的快乐

    一.什么是反射 反射Reflection:System.Reflection,是.Net Framework提供的一个帮助类库,可以读取并使用metadata. 反射是无处不在的,MVC-Asp.Ne ...

  10. Laravel学习笔记之PHP反射(Reflection) (上)

    Laravel学习笔记之PHP反射(Reflection) (上) laravel php reflect 2.1k 次阅读  ·  读完需要 80 分钟 3 说明:Laravel中经常使用PHP的反 ...

随机推荐

  1. 谁也无法挡住我访问Google---使用Nginx反向代理攻略

    展示最终成果: 浏览器打开​ http://www.manda13.com/(慢搭搜索)这个是自己搭建的百度网盘搜索,欢迎测试 点击右上角“原版Google”,就可以访问Google. 是不是很方便. ...

  2. jquery网页换肤+jquery的cookie+动态调用css样式文件,可以的

    比较具有参考性,代码全贴(当然,还需要一张图片需要的留个邮箱,看到就发) 贴在这儿吧,修改一下css的引用位置应该可以用 <%@ page language="java" c ...

  3. Nop源码分析三

    程序的初始化工作和Ioc工作已经做完,nop默认引擎已经初始化. 下面在回到global文件的启动方法Application_Start()中, 1,继续分析下面的代码: var dependency ...

  4. 无法打开物理文件xxx.mdf操作系统错误 5:“5(拒绝访问。)” (Microsoft SQL Server,错误: 5120)的解决方法

    无法打开物理文件xxx.mdf操作系统错误 5:“5(拒绝访问.)” (Microsoft SQL Server,错误: 5120)的解决方法   问题描述: 在附加数据库到sql server时,附 ...

  5. redmine computed custom field formula tips

    项目中要用到Computed custom field插件,公式不知道怎么写,查了些资料,记录在这里. 1.http://apidock.com/ruby/Time/strftime 查看ruby的字 ...

  6. iOS屏幕旋转

    三种方法 需求:全局主要是竖屏 个别界面需要横屏

  7. 用hexdump获取event的输出信息

    当我们在调试输入设备时,如:键盘,触摸屏 会使用到hexdump工具.其内容如下: 1. 键盘: # cat /dev/input/event0 | hexdump 0000000 f6a6 4e15 ...

  8. apache2.4配置访问日志分割并过滤图片CSS等无用内容

    相关信息 1.apache日志有访问日志和错误日志,错误日志根据日志级别来输出错误信息,而访问日志根据定义的日志格式来记录访问动作 2.访问日志格式在httpd.conf文件里面定义,在虚拟主机里面引 ...

  9. 微信小程序组件-----城市切换

    直接上地址,有需要的直接下载,使用: https://github.com/chenjinxinlove/citySelect

  10. ProcessBuilder 、Runtime和Process 的区别

    1.版本原因 ProcessBuilder是从java1.5加进来的,而exec系列方法是从1.0开始就有的,后续版本不断的重载这个方法,到了1.5已经有6个之多. 2.ProcessBuilder. ...