C#基础知识总结(三)--反射
如何在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#基础知识总结(三)--反射的更多相关文章
- C# 基础知识系列- 10 反射和泛型(二)
0. 前言 这篇文章延续<C# 基础知识系列- 5 反射和泛型>,继续介绍C#在反射所开发的功能和做的努力.上一篇文章大概介绍了一下泛型和反射的一些基本内容,主要是通过获取对象的类型,然后 ...
- 运维之Linux基础知识(三)
运维之Linux基础知识(三) 1. 查看文本 cat tac more less head tail 1.1 cat 连接并显示文件 cat -n:在显示的时候,将每一行编号 -E:显示结束符$ - ...
- Java开发培训基础知识解析之反射机制
Java是老牌编程语言,是当前应用最广泛的编程语言之一.想要学习Java你就一定要掌握Java基础知识,而反射对于初学Java的人来说绝对是非常重要的知识点.什么是反射?如何理解反射机制?如何使用反射 ...
- Java JDBC的基础知识(三)
在前面的Java JDBC的基础知识(二)和(三)中,主要介绍JDBC的原理和简单的应用过程.尤其在(二)中,可以发现代码进行多次try/catch,还有在前面创建连接等过程中好多参数我都给写定了. ...
- 基础知识《三》java修饰符
一.修饰符 private 成员随时都是“私有”的,任何人不得访问.但在实际应用中,经常想把某些东西深深地藏起来,但同时允许访问衍生类的成员. protected 关键字可帮助我们做到这一点.它的意思 ...
- 林大妈的JavaScript基础知识(三):JavaScript编程(2)函数
JavaScript是一门函数式的面向对象编程语言.了解函数将会是了解对象创建和操作.原型及原型方法.模块化编程等的重要基础.函数包含一组语句,它的主要功能是代码复用.隐藏信息和组合调用.我们编程就是 ...
- Jquery源码中的Javascript基础知识(三)
这篇主要说一下在源码中jquery对象是怎样设计实现的,下面是相关代码的简化版本: (function( window, undefined ) { // code 定义变量 jQuery = fun ...
- Android中的一些基础知识(三)
最近在回顾Android的基础知识,就把一些常见的知识点整理一下,以后忘了也可以翻出来看一看. 在TextView中显示图像(使用< img>标签) 在TextView中显示图片的方法有许 ...
- ASP.NET Core 基础知识(三) Program.cs类
ASP.NET Framework应用程序是严重依赖于IIS的,System.Web 中有很多方法都是直接调用的 IIS API,并且它还是驻留在IIS进程中的.而 ASP.NET Core 的运行则 ...
- java反射基础知识(三)
原文地址:http://tutorials.jenkov.com/java-reflection/index.html http://www.cnblogs.com/penghongwei/p/329 ...
随机推荐
- python使用zabbix的API接口
一.实验环境 python3.6.6 zabbix 3.0.9 二.实验目的 了解Zabbix的API接口格式 通过python实现登陆zabbix服务,获得登陆token 通过python检索zab ...
- 【畅通工程 HDU - 1232 】【并查集模板】
并查集讲解和模板 有一个博文对此分析的很透彻,附链接 为避免原链接失效,现摘录如下: 为了解释并查集的原理,我将举一个更有爱的例子. 话说江湖上散落着各式各样的大侠,有上千个之多.他们没有什么正当职业 ...
- python所有的内置异常类型汇总
内置异常基类 在 Python 中,所有异常必须为一个派生自 BaseException 的类的实例. 通过子类化创建的两个不相关异常类永远是不等效的,既使它们具有相同的名称. 下列异常主要被用作其他 ...
- Windows上IDEA搭建最新Spark2.4.3源码调试的开发环境
相信很多同学都想通过阅读一些框架的源码,来提高自己的代码能力,但往往在第一步,搭建环境的时候就碰了壁. 本篇就来介绍下如何在Windows下,将最新版的Spark2.4.3编译,并导入到IDEA编译器 ...
- hibernate 报错com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException
解释:JavaBean的主键类型只能是int类型,因为在映射关系配置是自动增长的,String类型是不能自动增长的,所以会报错.
- C++ 线程安全的单例模式总结
什么是线程安全? 在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况. 如何保证线程安全? 给共享的资源加把锁,保证每 ...
- 并发新特性—Executor框架与线程池
http://blog.csdn.net/ns_code/article/details/17465497 Executor框架简介 在Java5之后,并发编程引入了一堆新的启动.调度和管理线程的AP ...
- RestTemplate 1
@Inject private RestTemplate restTemplate; @SuppressWarnings("unchecked") public Use ...
- HTML(六)框架,颜色,脚本,字符实体,统一资源定位器
HTML 框架 HTML框架 通过使用框架,你可以在同一个浏览器窗口中显示不止一个页面 Iframe移除边框 使用iframe来显示目标链接页面 RUNOOB.COM HTML 颜色 rgb(255, ...
- Contour 学习笔记(二):使用级联功能实现蓝绿部署和金丝雀发布
上篇文章介绍了 Contour 分布式架构的工作原理,顺便简单介绍了下 IngressRoute 的使用方式.本文将探讨 IngressRoute 更高级的用法,其中级联功能是重点. 1. Ingre ...