什么是反射


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如何删除一个Cookie值
Nov 15 面试题
SQL Server 2000数据库的文件有哪些,分别进行描述。
Nov 09 面试题
私有程序集与共享程序集有什么区别
Apr 05 面试题
Discard Protocol抛弃协议的作用是什么
Oct 10 面试题
上海中网科技笔试题
Feb 19 面试题
Linux的文件类型
Mar 07 面试题
Linux不知道文件后缀名怎么判断文件类型
Apr 26 面试题
如果让你测试一台高速激光打印机,你都会进行哪些测试
Dec 04 面试题
50道外企软件测试面试题
Aug 18 面试题
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
Apr 13 面试题
shell的种类有哪些
Apr 15 面试题
Servlet如何得到服务器的信息
Dec 22 面试题
接口的多继承会带来哪些问题
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编程最快明白(第一讲 软件环境和准备工作)
2010/10/25 PHP
PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
2011/11/10 PHP
探讨php中header的用法详解
2013/06/07 PHP
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
PHP判断一个字符串是否是回文字符串的方法
2015/03/23 PHP
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
2019/10/15 PHP
baidu博客的编辑友情链接的新的层窗口!经典~支持【FF】
2007/02/09 Javascript
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
toString()一个会自动调用的方法
2010/02/08 Javascript
Extjs TimeField 显示正常时间格式的代码
2011/06/28 Javascript
推荐11款jQuery开发的复选框和单选框美化插件
2011/08/02 Javascript
浅谈angularjs依赖服务注入写法的注意点
2017/04/24 Javascript
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
详解webpack+express多页站点开发
2017/12/22 Javascript
vue实现表格过滤功能
2019/09/27 Javascript
如何在JavaScript中创建具有多个空格的字符串?
2020/02/23 Javascript
vue实现前端分页完整代码
2020/06/17 Javascript
python实现图片批量剪切示例
2014/03/25 Python
Python实现的HTTP并发测试完整示例
2020/04/23 Python
pycharm中显示CSS提示的知识点总结
2019/07/29 Python
用python拟合等角螺线的实现示例
2019/12/27 Python
Pandas之read_csv()读取文件跳过报错行的解决
2020/04/21 Python
python 对一幅灰度图像进行直方图均衡化
2020/10/27 Python
英国排名第一的最新设计师品牌手表独立零售商:TIC Watches
2016/09/24 全球购物
欧洲最大的化妆品连锁公司:Douglas道格拉斯
2017/05/06 全球购物
We Fashion荷兰:一家国际时装公司
2018/04/18 全球购物
社会保险接收函
2014/01/12 职场文书
机电专业大学生职业规划书范文
2014/02/25 职场文书
竞选班委演讲稿
2014/04/28 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
关于运动会广播稿50字
2014/10/18 职场文书
行政处罚事先告知书
2015/07/01 职场文书
教师网络培训心得体会
2016/01/09 职场文书
MySQL数据库之存储过程 procedure
2022/06/16 MySQL