C#高级编程 反射 代码示例
2016-01-14 15:20
507 查看
反射
反射(Reflection)是.NET中的重要机制,通过反射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。
还可以获得每个成员的名称、限定符和参数等。
设计模式中
采用反射技术可以简化工厂的实现
1.工厂方法:通过反射可以将需要实现的子类名称传递给工厂方法,这样无须在子类中实现类的实例化。
2.抽象工厂:使用反射可以减少抽象工厂的子类。
采用反射技术可以极大简化对象的生成
1.命令模式:可以采用命令的类型名称作为参数直接获得命令的实例,并且可以动态执行命令。
2.享元模式:采用反射技术实例化享元可以简化享元工厂。
反射演示代码,如下:
反射(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# 新委托使用方法 Lambda表达式,运算符 =>
- c# 替换所有中文、标点符号,全角转半角
- 跟siki老师学C#第一天
- C#实现百度站长工具链接主动提交功能
- 关于C#下面windows服务读取注册表的问题
- C# String与string的区别
- C#中null和""的区别
- 转载: 黄聪:C#中 Excel列字母与数字的转换
- c#按照一定条件打印
- c#开发之多国语言解决方案gnu.gettext + poedit
- C#实现的18位身份证格式验证算法
- c#图片添加水印
- C# serialport控件的一些理解
- C#的历史及IDE总结
- C# Best Practices - Creating Good Methods
- C#调用dll函数时出错:视图加载格式不正常的程序
- C# 雕虫小技
- C#源代码—三角形面积、圆的面积
- C#源代码—姓名 请输入老师的编号、姓名、职称和部门
- C# string字符串转换为字节数组和转换为16进制的字符串形式