什么是反射


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

面试题 相关文章推荐
如果NULL定义成#define NULL((char *)0)难道不就可以向函数传入不加转换的NULL了吗
Feb 15 面试题
文件中有一组整数,要求排序后输出到另一个文件中
Jan 04 面试题
ddl,dml和dcl的含义
May 08 面试题
什么是触发器(trigger)? 触发器有什么作用?
Sep 18 面试题
值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型
Oct 24 面试题
Windows和Linux动态库应用异同
Jul 28 面试题
如何开发一个JQuery插件
Jul 28 面试题
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
Aug 18 面试题
Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Jan 27 面试题
关于Java finally的面试题
Apr 27 面试题
三个Unix的命令面试题
Apr 12 面试题
J2EE模式面试题
Oct 11 面试题
接口的多继承会带来哪些问题
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字符集转换
2017/01/23 PHP
jquery选择器(常用选择器说明)
2010/09/28 Javascript
jQuery实现购物车计算价格功能的方法
2015/03/25 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
jQuery+PHP+MySQL实现无限级联下拉框效果
2016/02/19 Javascript
jQuery弹出层后禁用底部滚动条(移动端关闭回到原位置)
2016/08/29 Javascript
JS定时器用法分析【时钟与菜单中的应用】
2016/12/21 Javascript
ajax与json 获取数据并在前台使用简单实例
2017/01/19 Javascript
详解angularjs获取元素以及angular.element()用法
2017/07/25 Javascript
基于jstree使用AJAX请求获取数据形成树
2017/08/29 Javascript
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
2017/08/30 Javascript
详解使用webpack构建多页面应用
2017/12/21 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
详解ajax的data参数错误导致页面崩溃
2018/04/30 Javascript
Node.js console控制台简单用法分析
2019/01/04 Javascript
离线安装Pyecharts的步骤以及依赖包流程
2020/04/23 Python
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
python 日志增量抓取实现方法
2018/04/28 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
django 连接数据库 sqlite的例子
2019/08/14 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
Django Channel实时推送与聊天的示例代码
2020/04/30 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
2020/06/24 Python
关于Python字符编码与二进制不得不说的一些事
2020/10/04 Python
用sleep间隔进行python反爬虫的实例讲解
2020/11/30 Python
Canvas与图片压缩的示例代码
2017/11/28 HTML / CSS
台湾网友喜爱的综合型网路购物商城:Yahoo! 奇摩购物中心
2018/03/10 全球购物
美国瑜伽服装和装备购物网站:Mukha Yoga
2019/02/22 全球购物
幼儿园庆六一活动方案
2014/03/06 职场文书
毕业寄语大全
2014/04/09 职场文书
求职信范文大全
2014/05/26 职场文书
升学宴学生答谢词
2015/01/05 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
在人间读书笔记
2015/06/30 职场文书
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP