什么是反射


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面试题-$message和$$message的区别
Dec 08 面试题
xml有哪些解析技术?区别是什么
Apr 26 面试题
哪些情况下不应该使用索引
Jul 20 面试题
一道SQL存储过程面试题
Oct 07 面试题
Linux管理员面试题 Linux admin interview questions
Nov 01 面试题
MIS软件工程师的面试题
Apr 22 面试题
如果Session Bean得Remove方法一直都不被调用会怎么样
Jul 14 面试题
用Python写一个for循环的例子
Jul 19 面试题
MYSQL相比于其他数据库有哪些特点
Jul 19 面试题
编程输出如下图形
Nov 24 面试题
掌上明珠Java程序员面试总结
Feb 23 面试题
介绍一下UNIX启动过程
Nov 14 面试题
接口的多继承会带来哪些问题
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 删除cookie方法详解
2014/12/01 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
PHP receiveMail实现收邮件功能
2018/04/25 PHP
JS小框架 fly javascript framework
2009/11/26 Javascript
javascript学习笔记(九) js对象 设计模式
2012/06/19 Javascript
JS性能优化笔记搜索整理
2013/08/21 Javascript
javascript实现平滑无缝滚动
2020/08/09 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
jQuery实现可移动选项的左右下拉列表示例
2016/12/26 Javascript
原生js实现手风琴功能(支持横纵向调用)
2017/01/13 Javascript
jQuery的$.extend 浅拷贝与深拷贝
2017/03/08 Javascript
Bootstrap模态框插入视频的实现代码
2017/06/25 Javascript
vue 设置 input 为不可以编辑的实现方法
2019/09/19 Javascript
跟老齐学Python之再深点,更懂list
2014/09/20 Python
Python zip()函数用法实例分析
2018/03/17 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
python实现控制台打印的方法
2019/01/12 Python
Python基于mysql实现学生管理系统
2019/02/21 Python
Django项目中添加ldap登陆认证功能的实现
2019/04/04 Python
pytorch打印网络结构的实例
2019/08/19 Python
pytorch 图像预处理之减去均值,除以方差的实例
2020/01/02 Python
查看keras的默认backend实现方式
2020/06/19 Python
在HTML5中如何使用CSS建立不可选的文字
2014/10/17 HTML / CSS
HTML5中Canvas与SVG的画图原理比较
2013/01/16 HTML / CSS
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
英语专业学子个人的自我评价
2013/10/02 职场文书
聚美优品恶搞广告词
2014/03/14 职场文书
保护野生动物倡议书
2014/05/16 职场文书
大学应届毕业生求职信
2014/05/24 职场文书
寻找最美家庭活动方案
2014/08/20 职场文书
优秀党员事迹材料
2014/12/18 职场文书
公务员考察材料
2014/12/23 职场文书
教导主任个人总结
2015/03/03 职场文书
Redis缓存-序列化对象存储乱码问题的解决
2021/06/21 Redis