什么是反射


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

面试题 相关文章推荐
方法名是否可以与构造器的名字相同
Jun 04 面试题
什么是Smart Navigation?
Jul 03 面试题
一套带网友答案的.NET笔试题
Dec 06 面试题
.NET常见笔试题集
Dec 01 面试题
TCP/IP中的TCP和IP分别承担什么责任
Apr 21 面试题
HSRP的含义以及如何工作
Sep 10 面试题
C#和SQL Server的面试题
Aug 12 面试题
sealed修饰符是干什么的
Oct 23 面试题
Linux常见面试题
Mar 18 面试题
中间件分为哪几类
Sep 18 面试题
AJax面试题
Nov 25 面试题
请说出这段代码执行后a和b的值分别是多少
Mar 28 面试题
接口的多继承会带来哪些问题
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程序中的常见漏洞进行攻击
2006/10/09 PHP
php+js实现图片的上传、裁剪、预览、提交示例
2013/08/27 PHP
php解析字符串里所有URL地址的方法
2015/04/03 PHP
PHP parse_ini_file函数的应用与扩展操作示例
2019/01/07 PHP
jQuery下实现等待指定元素加载完毕(可改成纯js版)
2013/07/11 Javascript
js统计页面的来访次数实现代码
2014/05/09 Javascript
Node.js中使用Log.io在浏览器中实时监控日志(等同tail -f命令)
2014/09/17 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
在JavaScript中访问字符串的子串
2015/07/07 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
2015/12/06 Javascript
简述jQuery ajax的执行顺序
2016/01/05 Javascript
js修改onclick动作的四种方法(推荐)
2016/08/18 Javascript
Web打印解决方案之证件套打的实现思路
2016/08/29 Javascript
给easyui的datebox控件添加清空按钮的实现方法
2016/11/09 Javascript
详谈表单格式化插件jquery.serializeJSON
2017/06/23 jQuery
基于JavaScript中标识符的命名规则介绍
2018/01/06 Javascript
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
js实现弹窗效果
2020/08/09 Javascript
[49:27]LGD vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python 统计代码行数简单实例
2017/05/04 Python
OpenCV 轮廓检测的实现方法
2019/07/03 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
Python实现名片管理系统
2020/02/14 Python
Python作用域与名字空间原理详解
2020/03/21 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
Python 随机按键模拟2小时
2020/12/30 Python
深入解读CSS3中transform变换模型的渲染
2016/05/27 HTML / CSS
ECCO俄罗斯官网:北欧丹麦鞋履及皮具品牌
2020/06/26 全球购物
UNIX操作系统结构由哪几部分组成
2016/02/17 面试题
黄河象教学反思
2014/02/10 职场文书
检讨书范文大全
2015/05/07 职场文书
审查起诉阶段律师意见书
2015/05/19 职场文书
幼儿园新生开学寄语
2015/05/27 职场文书
2016年领导干部正风肃纪心得体会
2015/10/09 职场文书
Vue Element plus使用方法梳理
2022/12/24 Vue.js