什么是反射


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...

面试题 相关文章推荐
解释一下ArrayList Vector和LinkedList的实现和区别
Apr 26 面试题
面向对象编程的优势是什么
Dec 17 面试题
在C语言中"指针和数组等价"到底是什么意思?
Mar 24 面试题
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
Aug 15 面试题
上海奥佳笔试题面试题
Nov 16 面试题
DBA数据库管理员JAVA程序员架构师必看
Feb 07 面试题
What is view? why do we have view?
Jun 22 面试题
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
Jun 16 面试题
什么是反射?如何实现反射?
Jul 25 面试题
MIS软件工程师的面试题
Apr 22 面试题
重写子类方法时,抛出异常的书写注意事项
Oct 17 面试题
如何现实servlet的单线程模式
Aug 05 面试题
接口的多继承会带来哪些问题
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几个数学计算的内部函数学习整理
2011/08/06 PHP
php DOS攻击实现代码(附如何防范)
2012/05/29 PHP
php备份数据库类分享
2015/04/14 PHP
PHP实现通过CURL上传文件功能示例
2018/05/30 PHP
用正则xmlHttp实现的偷(转)
2007/01/22 Javascript
js网页侧边随页面滚动广告效果实现
2011/04/14 Javascript
利用jQuery的deferred对象实现异步按顺序加载JS文件
2013/03/17 Javascript
JS实现点击下载的小例子
2013/07/10 Javascript
Javascript中Event属性搜集整理
2013/09/17 Javascript
javascript使用正则表达式实现去掉空格之后的字符
2015/02/15 Javascript
jQuery选择器源码解读(二):select方法
2015/03/31 Javascript
js实现两点之间画线的方法
2015/05/12 Javascript
javascript事件冒泡简单示例
2016/06/20 Javascript
JS两种类型的表单提交方法实例分析
2016/11/28 Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
2018/03/20 Javascript
Vue.js上传图片到阿里云OSS存储的方法示例
2018/12/13 Javascript
[02:51]2014DOTA2国际邀请赛 IG战队官方纪录片
2014/07/21 DOTA
python基础教程之元组操作使用详解
2014/03/25 Python
Python中的迭代器漫谈
2015/02/03 Python
Python利用正则表达式匹配并截取指定子串及去重的方法
2015/07/30 Python
python 写的一个爬虫程序源码
2016/02/28 Python
python计算两个矩形框重合百分比的实例
2018/11/07 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
2019/05/29 Python
Python3内置模块pprint让打印比print更美观详解
2019/06/02 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
2020/04/22 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
马来西亚网上花店:FlowerAdvisor马来西亚
2020/01/03 全球购物
环境工程毕业生自荐信
2013/11/17 职场文书
煤矿班组长岗位职责
2013/12/29 职场文书
白酒市场开发计划书
2014/01/09 职场文书
经贸日语专业个人求职信范文
2014/04/29 职场文书
机关中层领导干部群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
医生个人年终总结
2015/02/28 职场文书
现货白银电话营销话术
2015/05/29 职场文书
浅谈node.js中间件有哪些类型
2021/04/29 Javascript
SQL Server2019数据库备份与还原脚本,数据库可批量备份
2021/11/20 SQL Server