什么是反射


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

面试题 相关文章推荐
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?用contains来区分是否有重复的对象。还是都不用
Jul 30 面试题
为什么要有struct关键字
May 08 面试题
链表面试题-一个链表的结点结构
May 04 面试题
在什么时候需要使用"常引用"
Dec 31 面试题
Sql面试题
Mar 20 面试题
一个SQL面试题
Aug 21 面试题
Oracle快照(snapshot)
Mar 13 面试题
WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用?
Aug 25 面试题
GWT (Google Web Toolkit)有哪些主要的原件组成?
Jun 08 面试题
AJax面试题
Nov 25 面试题
Java语言程序设计测试题选择题部分
Apr 03 面试题
万户网络JAVA程序员岗位招聘笔试试卷
Jan 08 面试题
接口的多继承会带来哪些问题
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跨平台获取服务器IP地址自定义函数分享
2014/12/29 PHP
phpStorm+XDebug+chrome 配置详解
2019/04/01 PHP
laravel model 两表联查示例
2019/10/24 PHP
8款非常棒的响应式jQuery 幻灯片插件推荐
2012/02/02 Javascript
jquery 实现密码框的显示与隐藏示例代码
2013/09/18 Javascript
js克隆对象、数组的常用方法介绍
2013/09/26 Javascript
jQuery焦点图切换简易插件制作过程全纪录
2014/08/27 Javascript
JavaScript导出Excel实例详解
2014/11/25 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
2015/08/04 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
2016/06/08 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
在vue-cli的组件模板里使用font-awesome的两种方法
2018/09/28 Javascript
JSX在render函数中的应用详解
2019/09/04 Javascript
Vue组件通信中非父子组件传值知识点总结
2019/12/05 Javascript
javascript异常处理实现原理详解
2020/02/17 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
[04:19]完美世界携手游戏风云打造 卡尔工作室模型介绍篇
2013/04/24 DOTA
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
基于Python在MacOS上安装robotframework-ride
2018/12/28 Python
自定义django admin model表单提交的例子
2019/08/23 Python
python基于property()函数定义属性
2020/01/22 Python
Python爬虫实现模拟点击动态页面
2020/03/05 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
2020/09/01 Python
css3实现多个元素依次显示效果
2017/12/12 HTML / CSS
英国独特礼物想法和个性化礼物网站:notonthehighstreet.com
2018/04/16 全球购物
护士自我鉴定
2013/10/23 职场文书
保险公司晨会主持词
2014/03/22 职场文书
出生公证委托书
2014/04/03 职场文书
护士工作失误检讨书
2014/09/14 职场文书
个人先进材料范文
2014/12/30 职场文书
化验员岗位职责
2015/02/14 职场文书
职位证明模板
2015/06/23 职场文书
一行代码python实现文件共享服务器
2021/04/22 Python