什么是反射


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面试题集
Dec 18 面试题
康拓普公司Java笔面试
Sep 23 面试题
怎样比较两个类型为String的字符串
Aug 17 面试题
C语言面试题
Oct 30 面试题
枚举和一组预处理的#define有什么不同
Sep 21 面试题
利用异或运算实现两个无符号数的加法运算
Dec 20 面试题
写一个在SQL Server创建表的SQL语句
Mar 10 面试题
北京RT科技有限公司.net工程师面试题
Feb 15 面试题
.NET笔试题(20个问题)
Feb 02 面试题
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
Sep 06 面试题
ajax是什么及其工作原理
Feb 08 面试题
如何用Java实现列出某个目录下的所有子目录
Jul 20 面试题
接口的多继承会带来哪些问题
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/03/03 PHP
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
2010/04/02 PHP
全面解析PHP面向对象的三大特征
2017/06/10 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
2017/10/25 PHP
JS BASE64编码 window.atob(), window.btoa()
2021/03/09 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
2014/04/22 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
2014/10/20 Javascript
javascript实现瀑布流自适应遇到的问题及解决方案
2015/01/28 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
2016/02/17 Javascript
JS中位置与大小的获取方法
2016/11/22 Javascript
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
Vue之mixin全局的用法详解
2018/08/22 Javascript
vue使用高德地图点击下钻上浮效果的实现思路
2019/10/12 Javascript
详解Vue的ref特性的使用
2020/01/24 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
python格式化字符串实例总结
2014/09/28 Python
用Python实现协同过滤的教程
2015/04/08 Python
python实现的简单窗口倒计时界面实例
2015/05/05 Python
Python二叉树的定义及常用遍历算法分析
2017/11/24 Python
python dict 相同key 合并value的实例
2019/01/21 Python
详解python--模拟轮盘抽奖游戏
2019/04/12 Python
python中时间模块的基本使用教程
2019/05/14 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
Python如何使用input函数获取输入
2020/08/06 Python
详解vscode实现远程linux服务器上Python开发
2020/11/10 Python
美丽的现代设计家具:2Modern
2018/07/26 全球购物
super关键字的用法
2012/04/10 面试题
应届大学生求职的自我评价
2013/11/17 职场文书
编辑找工作求职信分享
2014/01/03 职场文书
4s店销售经理岗位职责
2014/07/19 职场文书
科长个人四风问题整改措施思想汇报
2014/10/13 职场文书
教育项目合作协议书格式
2014/10/17 职场文书
任命通知范文
2015/04/21 职场文书
优秀毕业生主要事迹材料
2015/11/04 职场文书