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 有 ...
随机推荐
- MUI - Scroll插件的使用
http://dev.dcloud.net.cn/mui/ui/#scroll 神坑1:如果在vuejs中使用,那么需要配合mui.ready(function(){}) 才能找到dom对象,具体de ...
- PHP文件漏桐可以通过对服务器进行设置和配置来达到防范目的
对脚本执行漏洞的防范 黑客利用脚本执行漏洞进行攻击的手段是多种多样的,而且是灵活多变的,对此,必须要采用多种防范方法综合的手段,才能有效防止黑客对脚本执行漏洞进行攻击.这里常用的方法方法有以下四种.一 ...
- php isset() empty() 区别, 判断 变量存在与否神器
先看PHP手册: bool empty ( mixed $var ) 判断一个变量是否被认为是空的.当一个变量并不存在,或者它的值等同于FALSE,那么它会被认为不存在.如果变量不存在的话,empty ...
- WordPress工作原理之程序文件执行顺序
在了解WordPress挂载机制时,一直有一个疑惑,到底是WordPress的内核源文件先执行还是主题文件里functions.php文件先执行.为了解决这个问题,想了解WordPress的工作原理, ...
- B-Tree indexs
mysql_High.Performance.MySQL.3rd.Edition.Mar.2012 A B-Tree index speeds up data access because the s ...
- SQL2005的cte递归查询子树
;with cteas(select id,caption,parentid,1 Gen from skywfflow where parentid =0UNION ALL select a.id,a ...
- .Net 2.0自带的Json序列化、反序列化方法
public class JsonUtil { public static T DeserializeObject<T>(string json) { ...
- ava.lang.NullPointerException的一般解决方法
抛出异常后,一般会输出异常信息,, 从上往下找 ,第一次出现与"自己的代码"有关的部分,就是异常抛出的最近点,异常就是在那里开始的 然后再顺藤摸瓜 找问题去吧
- docker es and es cluster
How to use this image You can run the default elasticsearch command simply: $ docker run -d elastics ...
- 通过runtime替换系统类实现的代码(从github开源库fdstackview中摘录)
其中部分代码为汇编:由此可见oc的runtime的灵活性和能力.此代码仅供参考 // ---------------------------------------------------- // R ...