C#高级编程 反射 代码示例
反射
反射(Reflection)是.NET中的重要机制,通过反射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。
还可以获得每个成员的名称、限定符和参数等。
设计模式中
采用反射技术可以简化工厂的实现
1.工厂方法:通过反射可以将需要实现的子类名称传递给工厂方法,这样无须在子类中实现类的实例化。
2.抽象工厂:使用反射可以减少抽象工厂的子类。
采用反射技术可以极大简化对象的生成
1.命令模式:可以采用命令的类型名称作为参数直接获得命令的实例,并且可以动态执行命令。
2.享元模式:采用反射技术实例化享元可以简化享元工厂。
反射演示代码,如下:
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
//[STAThread]
static void Main()
{
//Application.EnableVisualStyles();
//Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1());
System.Console.WriteLine("列出程序集中的所有类型");
//System.Reflection.Assembly 表示一个程序集,它是一个可重用、无版本冲突并且可自我描述的公共语言运行时应用程序构造块
Assembly a = Assembly.LoadFrom("Reflection.exe");
//类型声明
Type[] mytypes = a.GetTypes();
foreach (Type t in mytypes)
{
System.Console.WriteLine(t.Name);
}
System.Console.ReadLine();
System.Console.WriteLine("列出HellWord中的所有方法");
Type ht = typeof(HelloWorld);
// System.Reflection.MethodInfo 发现方法的属性并提供对方法元数据的访问
MethodInfo[] mif = ht.GetMethods();
foreach (MethodInfo mf in mif)
{
System.Console.WriteLine(mf.Name);
}
System.Console.ReadLine();
System.Console.WriteLine("实例化HelloWorld,并调用SayHello方法");
//实例化HelloWorld
Object obj = Activator.CreateInstance(ht);
string[] s = { "zhenlei" };
//实例化HelloWorld
Object objName = Activator.CreateInstance(ht, s);
// System.Reflection.BindingFlags
//指定控制绑定和由反射执行的成员和类型搜索方法的标志。
//此枚举有一个 FlagsAttribute 特性,通过该特性可使其成员值按位组合。
BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
MethodInfo msayhello = ht.GetMethod("SayHello");
msayhello.Invoke(obj, null);
msayhello.Invoke(objName, null);
System.Console.ReadLine();
System.Console.Read();
}
}
/// <summary>
/// HelloWorld类
/// </summary>
public class HelloWorld
{
string myName = null;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="name"></param>
public HelloWorld(string name)
{
myName = name;
}
/// <summary>
/// 构造函数
/// </summary>
public HelloWorld()
: this(null)
{ }
/// <summary>
/// 属性
/// </summary>
public string Name
{
get
{
return myName;
}
}
/// <summary>
/// 方法
/// </summary>
public void SayHello()
{
if (myName == null)
{
System.Console.WriteLine("Hello World");
}
else
{
System.Console.WriteLine("Hello," + myName);
}
}
}
C#高级编程 反射 代码示例的更多相关文章
- 解决《UNIX环境高级编程》(APUE)示例代码的编译问题
转自 http://cunsheng.sinaapp.com/?p=360 APUE中示例很多, 把这些源码拿来跑跑调调对学习理解有着莫大的帮助, 随书网站就提供了源码下载, 不过我自己在Linux和 ...
- C#高级编程----反射的小结
C#反射的应用小结 1.何谓反射? 反射就是在运行的时候发现对象的相关信息.根据这些信息可以动态的执行对象的方法以及获取对象的属性所存储的值.使用.NET编写的代码时自动反射的,或者说是自我描述的.之 ...
- 利用注解进行sql反射代码示例
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Table { String val ...
- PHP高级特性-反射Reflection以及Factory工厂设计模式的结合使用[代码实例]
PHP高级特性-反射以及工厂设计模式的结合使用 [结合 Laravel-Admin 代码实例讲解] 利用反射来实现工厂模式的生产而无需创建特定的工厂类 本文地址http://janrs.com/?p= ...
- Unix环境高级编程第三版中实例代码如何在自己的linux上运行的问题
学习Linux已经有2个月了,最近被期末考试把进度耽误了,前几天把Unix环境高级编程看了两章,感觉对Linux的整体有了一些思路,今天尝试着对第一章涉及到的一个简单的交互式shell编译运行一下,结 ...
- unix环境高级编程附录 B 通用代码
0.说明: 在测试 unix 环境高级编程中的代码时,需要一些作者事先写好的代码, 如: apue.h 包含某些标准系统头文件,定义许多常量及函数原型 还有两个作者自编的函数来对错误进行处理 1.ep ...
- Linux - Unix环境高级编程(第三版) 代码编译
Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebo ...
- C++调用Lua编程环境搭建及测试代码示例
C++调用Lua编程环境搭建及测试代码示例 摘要:测试环境是VS2005+LuaForWindows_v5.1.4-45.exe+WIN7 1.安装lua开发环境LuaForWindows_v5.1. ...
- 高级渲染技巧和代码示例 GPU Pro 7
下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ...
随机推荐
- 小组项目beta发布的评价
这次最看好飞天小女警组,相比上次他们的界面漂亮了很多,功能也相对完善,他们的礼物挑选系统非常有创意.如果去网上爬更多的数据,这个项目会更完美. 新蜂团队的俄罗斯方块游戏新增加了显示下一个方块以及游戏积 ...
- shopnc2014年11版数据库字典
shopnc_activity 表注释: 活动表 字段 类型 空 默认 注释 activity_id mediumint(9) 否 id activity_title varchar(255) 否 ...
- DS实验题 最大最小
题目: 算法设计: 计算最小值算法: 设置一个flag,flag为1的时候代表遇到*号: 遇到数字时: flag为0进栈: flag为1的时候,从栈顶提出一个元素和当前元素运算,结果进栈 最后对栈进行 ...
- Javascript 笔记与总结(1-4)this
js 中函数的 4 种调用方式: ① 作为普通函数来调用,this 的值指向 window,准确地说,this 为 null,被解释成为 window.在 ECMAScript5 标准中,如果 thi ...
- 返回指定的VC
for (UIViewController *controller in self.navigationController.viewControllers) { if ([co ...
- 做了一个简易的git 代码自动部署脚本
做了一个简易的git 代码自动部署脚本 http://my.oschina.net/caomenglong/blog/472665 发表于2个月前(2015-06-30 21:08) 阅读(200 ...
- oracle sqlplus常用命令
登录到sqlplus sqlplus user/pwd@dbname 不登录使用 sqlplus /nolog 查看当前登录用户 show user; 更改用户密码 ALTER USER USER I ...
- PHP关闭提示、打印配置
打印配置 PHP.exe -i > Info.txt 关闭 PHP 提示的方法 搜索php.ini: error_reporting = E_ALL 改为: error_reporting = ...
- Overengineering
https://en.wikipedia.org/wiki/Overengineering Overengineering (or over-engineering) is the designing ...
- jvm 参数
参数名称 含义 默认值 -Xms 初始堆大小 物理内存的1/64(<1GB) 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限 ...