如何在C#.NET开发中使用反射。

首先,我新建一个普通的类库项目。在该项目的测试类中,定义好 属性、静态方法、实例方法、无参方法等... 代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ReflectorTest

{

class Test

{

private string name;

public string Name { get; set; }

/// <summary>

/// 静态方法

/// </summary>

/// <returns></returns>

public static string staticMethod(string  name)

{

return name;

}

/// <summary>

/// 实例方法

/// </summary>

/// <param name="name"></param>

/// <returns></returns>

public string sayHello(string name)

{

return "hello:" + name;

}

/// <summary>

/// 无参的方法

/// </summary>

/// <returns></returns>

public string noParm()

{

return "I'M  A noParm Method";

}

}

}

上面的类库项目,编译通过后,会生成一个DLL文件。好的,我们就是要通过“反射”技术,来尝试着看看这个DLL里面包含的相关元素信息,做一些模拟的操作等。

有点类似于“反编译”吧?呵呵。其实著名的Reflector.NET反编译工具,就是利用反射的原理。还有Microsoft Visual Studio 中的调试,背后也是利用反射技术..

具体的使用代码如下

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Reflection;

namespace Demo

{

class Program

{

static void Main(string[] args)

{

// reflectorInfo();

reflectorDemo();

Console.ReadKey();

}

/// <summary>

/// 利用反射去调用程序集中(包含的类)所包含的方法,属性,成员...

/// </summary>

public static void reflectorDemo()

{

Assembly ass;

Type type;

MethodInfo method;

try

{

ass = Assembly.LoadFile(@"F:\Projects\ReflectorTest\ReflectorTest\bin\Debug\ReflectorTest.DLL");//根据物理DLL路径尝试加载

type = ass.GetType("ReflectorTest.Test");//根据类型名称,反射出该类型(注意格式是:“命名空间.类名”)

object o =Activator.CreateInstance(type);//创建该类型的对象实例

method=type.GetMethod("sayHello");//反射获取方法(实例方法)

string s = (string)method.Invoke(o,new string[] {"dinglang"});//调用实例方法

Console.WriteLine("调用实例方法返回:"+s);

method=type.GetMethod("noParm");//无参方法

s= (string) method.Invoke(o,null);//调用无参函数

Console.WriteLine("调用无参方法返回:"+s);

//type.GetProperties()//获取该类型下面的所有公共属性

method=type.GetMethod("staticMethod");//静态函数

s=(string)method.Invoke(null,new string[]{"dinglang"});//调用静态方法

Console.WriteLine("调用静态方法返回:"+s);

//根据指定的属性名称,获得属性值

type.GetProperty("Name").GetValue(o,null);

//给属性设值

type.GetProperty("Name").SetValue(o, "dinglang", null);

}

catch (Exception)

{

throw;

}

finally

{

ass=null;

type=null;

method=null;

}

}

/// <summary>

/// 利用反射获取程序集中类,类的成员(方法,属性等)

/// </summary>

public static void reflectorInfo()

{

Assembly ass = Assembly.LoadFrom(@"F:\Projects\ReflectorTest\ReflectorTest\bin\Debug\ReflectorTest.DLL");//加载程序集

Module[] modules = ass.GetModules();//模块信息

Type[] types = ass.GetTypes();//获取该程序集所包含的所有类型

foreach (var item in types)

{

Console.WriteLine("所包含的类型类型名称:" + item.Name);

MethodInfo[] methods = item.GetMethods();//获取该类型下所包含的方法信息

foreach (var method in methods)

{

Console.WriteLine("该类下所包含的方法名称:"+method.Name);

}

PropertyInfo[] PropertyInfo = item.GetProperties();

foreach (var pro in PropertyInfo)

{

Console.WriteLine("该类下所包含的属性名称:" + pro.Name);

}

}

}

}

}

建议谨慎使用反射,因为反射很消耗性能!

C#基础知识总结(三)--反射的更多相关文章

  1. C# 基础知识系列- 10 反射和泛型(二)

    0. 前言 这篇文章延续<C# 基础知识系列- 5 反射和泛型>,继续介绍C#在反射所开发的功能和做的努力.上一篇文章大概介绍了一下泛型和反射的一些基本内容,主要是通过获取对象的类型,然后 ...

  2. 运维之Linux基础知识(三)

    运维之Linux基础知识(三) 1. 查看文本 cat tac more less head tail 1.1 cat 连接并显示文件 cat -n:在显示的时候,将每一行编号 -E:显示结束符$ - ...

  3. Java开发培训基础知识解析之反射机制

    Java是老牌编程语言,是当前应用最广泛的编程语言之一.想要学习Java你就一定要掌握Java基础知识,而反射对于初学Java的人来说绝对是非常重要的知识点.什么是反射?如何理解反射机制?如何使用反射 ...

  4. Java JDBC的基础知识(三)

    在前面的Java JDBC的基础知识(二)和(三)中,主要介绍JDBC的原理和简单的应用过程.尤其在(二)中,可以发现代码进行多次try/catch,还有在前面创建连接等过程中好多参数我都给写定了. ...

  5. 基础知识《三》java修饰符

    一.修饰符 private 成员随时都是“私有”的,任何人不得访问.但在实际应用中,经常想把某些东西深深地藏起来,但同时允许访问衍生类的成员. protected 关键字可帮助我们做到这一点.它的意思 ...

  6. 林大妈的JavaScript基础知识(三):JavaScript编程(2)函数

    JavaScript是一门函数式的面向对象编程语言.了解函数将会是了解对象创建和操作.原型及原型方法.模块化编程等的重要基础.函数包含一组语句,它的主要功能是代码复用.隐藏信息和组合调用.我们编程就是 ...

  7. Jquery源码中的Javascript基础知识(三)

    这篇主要说一下在源码中jquery对象是怎样设计实现的,下面是相关代码的简化版本: (function( window, undefined ) { // code 定义变量 jQuery = fun ...

  8. Android中的一些基础知识(三)

    最近在回顾Android的基础知识,就把一些常见的知识点整理一下,以后忘了也可以翻出来看一看. 在TextView中显示图像(使用< img>标签) 在TextView中显示图片的方法有许 ...

  9. ASP.NET Core 基础知识(三) Program.cs类

    ASP.NET Framework应用程序是严重依赖于IIS的,System.Web 中有很多方法都是直接调用的 IIS API,并且它还是驻留在IIS进程中的.而 ASP.NET Core 的运行则 ...

  10. java反射基础知识(三)

    原文地址:http://tutorials.jenkov.com/java-reflection/index.html http://www.cnblogs.com/penghongwei/p/329 ...

随机推荐

  1. Linux - 通过expect工具实现脚本的自动交互

    目录 1 安装expect工具 2 expect的常用命令 3 作用原理简介 3.1 示例脚本 3.2 脚本功能解读 4 其他脚本使用示例 4.1 直接通过expect执行多条命令 4.2 通过she ...

  2. Java面向对象特性总结

    1.面对对象与面对过程的区别 什么是封装?我看到过这样一个例子: 我要用洗衣机洗衣服,只需要按一下开关和洗涤模式就可以了.有必要了解洗衣机内 部的结构吗?有必要碰电动机吗?有必要了解如何通电的吗? 如 ...

  3. 从零开始搭建前后端分离的NetCore(EF Core CodeFirst+Au)+Vue的项目框架之二autofac解耦

    在 上一篇 中将项目的基本骨架搭起来能正常跑通,这一篇将讲到,如何通过autofac将DbContext和model进行解耦,只用添加model,而不用在DbContext中添加DbSet. 在这里就 ...

  4. c++中strcmp,strcopy函数的使用

    1.strcmp(str1,str2) C/C++函数,比较两个字符串, 设这两个字符串为str1,str2,若str1==str2,则返回零:若str1<str2,则返回负数:若str1> ...

  5. odoo t标签用法

    在odoo中,通过QWeb来对模板进行渲染后加载到浏览器中,而模板中有许多的标签来定制各种需求变化,在这里记录学习过程中碰到的标签定义,以方便查询. 模板中的标签统一都是以"t-" ...

  6. egret之moveclip 序列帧动画

    废话不多说,直接上代码: private addEffect(name, x: number, y: number, act?: string) { let data = RES.getRes(nam ...

  7. React之react-redux

    react-redux相关概念及设计思想介绍 1.react-redux 将所有组件分为两大类 UI组件(负责UI的呈现) 和 容器组件(负责管理数据和逻辑). 2.UI组件特点 只负责UI的呈现,不 ...

  8. JMeter特点&性能测试工具选型的原则&模拟压力的原理

    1.JMeter自身的特点 1)开源.轻量级.更适合自动化和持续集成(100M左右,LoadRunner 4G左右) 2)学习难度大 3)资料少.全英文 2. 性能测试工具选型的原则 1)成本 a.工 ...

  9. 洛谷 P1070 道路游戏 DP

    P1070 道路游戏 题意: 有一个环,环上有n个工厂,每个工厂可以生产价格为x的零钱收割机器人,每个机器人在购买后可以沿着环最多走p条边,一秒走一条,每条边不同时间上出现的金币是不同的,问如何安排购 ...

  10. POJ2723 Get Luffy Out解题报告tarjan+2-SAT+二分

    今天看到讲2-SAT比较好的blog,感觉微微的理解了2-SAT 传送门 参考: https://blog.csdn.net/leolin_/article/details/6680144 题意:你有 ...