反射
反射(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); } } }