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

示例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运行,调用成功后的信息如下所示:

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

C# 反射(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. hdu4283 You Are the One

    传送门 题目 The TV shows such as You Are the One has been very popular. In order to meet the need of boys ...

  2. 1.Basic Layouts

    使用过mfc编程,就知道控件需要自己拖放.当一个界面有很多小控件时,摆放这些控件特别麻烦. 但是qt编程中有布局(Layout),让系统来摆放控件.使整个控件有一致的外观和感觉,特别方便. 1.水平方 ...

  3. SpringMvc配置web.xml避免view被dispatcherServlet拦截

    在我们以SpringMvc作为开发框架,开发接口框架时,我们只用到Controller一层,因为数据是交到前端处理的,所以我们是不需要处理视图的.此时,在配置dispatcherServlet时,一般 ...

  4. Java50道经典习题-程序29 求矩阵对角线之和

    题目:求一个3*3矩阵对角线元素之和分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出. 例如:下面矩阵的对角线之和为24 1 4 6 2 5 3 9 7 8 public cla ...

  5. Python的__getattr__方法学习

    内容部分来自网络 __getattr__函数的作用: 如果属性查找(attribute lookup)在实例以及对应的类中(通过__dict__)失败, 那么会调用到类的__getattr__函数: ...

  6. 在eclipse中使用hadoop插件

    我的配置环境看我的上篇博文. 配置过程: (1)把插件放到eclipse/plugins目录下.(我的版本上一篇也有) )重启eclipse,配置Hadoop installation directo ...

  7. ASP.NET-GridView分页排序显示

    前期我们分别介绍了gridview怎么进行固定表多行数据显示,以及怎么设计花样表头.下面我们介绍怎么利用gridview进行分页显示的同时还可以进行排序显示. 显示效果 前端DEMO <span ...

  8. kuangbin专题K(next数组)

    题目链接: https://vjudge.net/contest/70325#problem/K 题意: 给出一个字符串 str, 求 str 的所有前缀总共出现的次数. 思路: 先求一次 next ...

  9. 区块链中的密码学(-)区块链中运用最广的散列算法-SHA256算法分析与实现

    在很多技术人员的眼中,区块链并不是一种新的技术,而是过去很多年计算机技术的组合运用.而在这个方方面面技术的运用上,基于密码学的加密算法可以说是区块链各种特点得以表现的根本,一旦目前使用的加密算法被证实 ...

  10. Linux下的hosts文件和network文件区别

    Linux下的hosts文件和network文件区别   Linux下有两种与计算机名相关的配置文件     1.hosts文件,路径:/etc/hosts,此文间是在网络上使用的, 用于解析计算机名 ...