什么是反射


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

面试题 相关文章推荐
PHP笔试题
Feb 22 面试题
weblogic面试题
Mar 07 面试题
得到Class的三个过程是什么
Aug 10 面试题
Java的五个基础面试题
Feb 26 面试题
用C语言实现文件读写操作
Oct 27 面试题
估算杭州有多少软件工程师
Aug 11 面试题
RIP版本1跟版本2的区别
Dec 30 面试题
别名指示符是什么
Oct 08 面试题
几个常见的消息中间件(MOM)
Jan 08 面试题
不同浏览器创建XMLHttpRequest方法有什么不同
Nov 17 面试题
Java如何读取CLOB字段
Oct 10 面试题
介绍一下javax.servlet.Servlet接口及其主要方法
Nov 30 面试题
接口的多继承会带来哪些问题
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
ThinkPHP框架分布式数据库连接方法详解
2017/03/14 PHP
PHP实现动态创建XML文档的方法
2018/03/30 PHP
PDO::getAvailableDrivers讲解
2019/01/28 PHP
javascript生成/解析dom的CDATA类型的字段的代码
2007/04/22 Javascript
jquery提示效果实例分析
2014/11/25 Javascript
基于javascript实现按圆形排列DIV元素(三)
2016/12/02 Javascript
关于页面刷新vuex数据消失问题解决方案
2017/07/03 Javascript
jQuery ajax读取本地json文件的实例
2017/10/31 jQuery
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
2018/07/10 Javascript
vuex的module模块用法示例
2018/11/12 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
Vue 指令实现按钮级别权限管理功能
2019/04/23 Javascript
Vue组件间通信 Vuex的用法解析
2019/08/05 Javascript
JS 5种遍历对象的方式
2020/06/16 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
2020/09/02 Javascript
python使用自定义user-agent抓取网页的方法
2015/04/15 Python
Python通过poll实现异步IO的方法
2015/06/04 Python
对Python之gzip文件读写的方法详解
2019/02/08 Python
Python里字典的基本用法(包括嵌套字典)
2019/02/27 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
2019/11/15 Python
python获取系统内存占用信息的实例方法
2020/07/17 Python
CSS3媒体查询Media Queries基础学习教程
2016/02/29 HTML / CSS
canvas实现图片马赛克的示例代码
2018/03/26 HTML / CSS
Carter’s官方旗舰店:美国受欢迎的婴童服装品牌
2018/01/21 全球购物
写出一个方法实现冒泡排序
2016/07/08 面试题
大学生蛋糕店创业计划书
2014/01/13 职场文书
大学生的自我鉴定范文
2014/01/21 职场文书
创先争优标语
2014/06/27 职场文书
我的大学四年规划书范文2014
2014/09/26 职场文书
作文评语集锦
2014/12/25 职场文书
关于职业道德的心得体会
2016/01/18 职场文书
积极心理学课程心得体会
2016/01/22 职场文书
世界文化遗产导游词
2019/08/07 职场文书
奖学金申请书(范文)
2019/08/14 职场文书
python实现双向链表原理
2022/05/25 Python