什么是反射


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

面试题 相关文章推荐
介绍Java的内部类
Oct 27 面试题
如何向接受结构参数的函数传入常数值
Feb 17 面试题
怎样从/向数据文件读/写结构
Nov 23 面试题
const char*, char const*, char*const的区别是什么
Jul 09 面试题
计算 s=(x*y)1/2,用两个宏定义来实现
Aug 11 面试题
类成员函数的重载、覆盖和隐藏区别
Jan 27 面试题
什么是Rollback Segment
Apr 22 面试题
.NET程序员的几道面试题
Jun 01 面试题
渗透攻击的测试步骤
Jun 07 面试题
EJB面试题
Jul 28 面试题
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
Jul 02 面试题
垃圾回收的优点和原理
May 16 面试题
接口的多继承会带来哪些问题
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
用文本文件制作留言板提示(上)
2006/10/09 PHP
织梦模板标记简介
2007/03/11 PHP
php配合jquery实现增删操作具体实例
2013/12/12 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
2016/03/23 PHP
分享一个漂亮的php验证码类
2016/09/29 PHP
PHP的curl函数的用法总结
2019/02/14 PHP
Javascript 面向对象特性
2009/12/28 Javascript
javascript中的this详解
2014/12/08 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
2017/10/26 Javascript
Vue中的异步组件函数实现代码
2018/07/20 Javascript
vue插槽slot的理解和使用方法
2019/04/03 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
nuxt 页面路由配置,主页轮播组件开发操作
2020/11/05 Javascript
vue项目中js-cookie的使用存储token操作
2020/11/13 Javascript
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python使用代理抓取网站图片(多线程)
2014/03/14 Python
Python学习笔记(一)(基础入门之环境搭建)
2014/06/05 Python
python遍历目录的方法小结
2016/04/28 Python
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
python爬虫爬取网页表格数据
2018/03/07 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
2019/04/29 Python
Python判断字符串是否xx开始或结尾的示例
2019/08/08 Python
Python关于__name__属性的含义和作用详解
2020/02/19 Python
One.com挪威:北欧成长最快的网络托管公司
2016/11/19 全球购物
马来西亚演唱会订票网站:StubHub马来西亚
2018/10/18 全球购物
英国电信商店:BT Shop
2019/12/17 全球购物
库房管理员岗位职责
2014/03/09 职场文书
个人公司授权委托书范本
2014/10/12 职场文书
飞越疯人院观后感
2015/06/09 职场文书
2016高考冲刺决心书
2015/09/23 职场文书
小学语文的各类谚语(70首)
2019/08/15 职场文书
MySQL数据库Innodb 引擎实现mvcc锁
2022/05/06 MySQL