什么是反射


Posted in 面试题 onMarch 17, 2012
反射,Reflection,通过它我们可以在运行时获得各种信息,如程序集、模块、类型、字段、属性、方法和事件
通过对类型动态实例化后,还可以对其执行操作
简单来说就是用string可以在runtime为所欲为的东西,实际上就是一个.net framework内建的万能工厂
一般用于插件式框架程序和设计模式的实现,当然反射是一种手段可以充分发挥其能量来完成你想做的任何事情(前面好象见过一位高人用反射调用一个官方类库中未说明的函数。。。)
示例:
using System;
using System.Collections.Generic;
using System.Text;
namespace Example25Lib
{
public class Class1
{
private string name;
private int age;
//如果显式的声明了无参数构造函数,客户端只需要用程序集的CreateInstance即可实例化该类
//在此特意不实现,以便在客户调用端体现构造函数的反射实现
//public Class1()
//{
//}
public Class1(string Name, int Age)
{
name = Name;
age = Age;
}
public void ChangeName(string NewName)
{
name = NewName;
}
public void ChangeAge(int NewAge)
{
age = NewAge;
}
public override string ToString()
{
return string.Format(“Name: {0}, Age: {1}”, name, age);
}
}
}
反射实例化对象并调用其方法,属性和事件的反射调用略去
using System;
using System.Collections.Generic;
using System.Text;
//注意添加该反射的命名空间
using System.Reflection;
namespace Example25
{
class Program
{
static void Main(string[] args)
{
//加载程序集
Assembly tmpAss = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + “Example25Lib.dll”);
//遍历程序集内所有的类型,并实例化
Type[] tmpTypes = tmpAss.GetTypes();
foreach (Type tmpType in tmpTypes)
{
//获取第一个类型的构造函数信息
ConstructorInfo[] tmpConsInfos = tmpType.GetConstructors();
foreach (ConstructorInfo tmpConsInfo in tmpConsInfos)
{
//为构造函数生成调用的参数集合
ParameterInfo[] tmpParamInfos = tmpConsInfo.GetParameters();
object[] tmpParams = new object[tmpParamInfos.Length];
for (int i = 0; i {
tmpParams[i] = tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName);
if (tmpParamInfos[i].ParameterType.FullName == “System.String”)
{
tmpParams[i] = “Clark”;
}
}
//实例化对象
object tmpObj = tmpConsInfo.Invoke(tmpParams);
Console.WriteLine(tmpObj);
//获取所有方法并执行
foreach (MethodInfo tmpMethod in tmpType.GetMethods())
{
//为方法的调用创建参数集合
tmpParamInfos = tmpMethod.GetParameters();
tmpParams = new object[tmpParamInfos.Length];
for (int i = 0; i {
tmpParams[i] = tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName);
if (tmpParamInfos[i].ParameterType.FullName == “System.String”)
{
tmpParams[i] = “Clark Zheng”;
}
if (tmpParamInfos[i].ParameterType.FullName == “System.Int32″)
{
tmpParams[i] = 27;
}
}
tmpMethod.Invoke(tmpObj, tmpParams);
}
//调用完方法后再次打印对象,比较结果
Console.WriteLine(tmpObj);
}
}
Console.ReadLine();
}
}
}
结果:
Name: Clark, Age: 0
Name: Clark Zheng, Age: 27

Tags in this post...

面试题 相关文章推荐
描述一下JVM加载class文件的原理机制
Dec 08 面试题
extern在函数声明中是什么意思
Jan 19 面试题
三维科技面试题
Jul 27 面试题
介绍一下HDLC(High-Level Data Link Control)高层数据链路协议
Jan 21 面试题
C#公司笔试题
Mar 28 面试题
一套C#面试题
Oct 09 面试题
C#面试题问题集
Apr 02 面试题
Linux机考试题
Jul 17 面试题
Linux的主要特性
Oct 06 面试题
Ajax的工作原理
Dec 04 面试题
构造方法和其他方法的区别
Apr 26 面试题
什么是继承
Dec 07 面试题
接口的多继承会带来哪些问题
Aug 17 #面试题
抽象类和接口的区别
Sep 19 #面试题
北京某科技有限公司C# .net笔试题
Sep 27 #面试题
用C#语言写出与SQLSERVER访问时的具体过程
Apr 16 #面试题
用C#语言写出在本地创建一个UDP接收端口的具体过程
Feb 22 #面试题
别名指示符是什么
Oct 08 #面试题
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
Jul 11 #面试题
You might like
PHP简单判断手机设备的方法
2016/08/23 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
2017/08/04 PHP
jQuery学习笔记(1)--用jQuery实现异步通信(用json传值)具体思路
2013/04/08 Javascript
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
一个js过滤空格的小函数
2014/10/10 Javascript
Bootstrap CSS布局之表单
2016/12/17 Javascript
如何写好你的JavaScript【推荐】
2017/03/02 Javascript
NodeJs的fs读写删除移动监听
2017/04/28 NodeJs
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
layui下拉框获取下拉值(select)的例子
2019/09/10 Javascript
Vue使用预渲染代替SSR的方法
2020/07/02 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
2020/12/19 Vue.js
Vue SPA 首屏优化方案
2021/02/26 Vue.js
[01:34]传奇从这开始 2016国际邀请赛中国区预选赛震撼开启
2016/06/26 DOTA
[12:29]2018国际邀请赛 开幕秀
2018/08/22 DOTA
python单线程实现多个定时器示例
2014/03/30 Python
Python ftp上传文件
2016/02/13 Python
Python实现简单字典树的方法
2016/04/29 Python
浅谈Python中range和xrange的区别
2017/12/20 Python
Python实现的HMacMD5加密算法示例
2018/04/03 Python
django和vue实现数据交互的方法
2019/08/21 Python
Python3操作YAML文件格式方法解析
2020/04/10 Python
Python参数传递及收集机制原理解析
2020/06/05 Python
Python通过zookeeper实现分布式服务代码解析
2020/07/22 Python
python实现mask矩阵示例(根据列表所给元素)
2020/07/30 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
CSS3弹性盒模型开发笔记(三)
2016/04/26 HTML / CSS
美国知名的时尚购物网站:Anthropologie
2016/12/22 全球购物
JBL美国官方商店:扬声器、耳机等
2019/12/01 全球购物
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
万豪国际住宅与别墅集团:Homes & Villas by Marriott International
2020/10/08 全球购物
8和9的加减法教学反思
2014/05/01 职场文书
留学生求职信
2014/06/03 职场文书
员工工作表现自我评价
2015/03/06 职场文书
用Python将库打包发布到pypi
2021/04/13 Python
python 单机五子棋对战游戏
2022/04/28 Python