.NET反射、委托技术与设计模式
(5)使用FiedInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。System.Runtime.Serialization命名空间中的类使用反射来访问数据并确定要永久保存的字段,System.Runtime.Remoting命名空间中的类通过序列化来间接地使用反射。
1.2 反射技术示例
下面是反射技术的示例,我们可以在程序去得时动态实例化对象,获得对象的属性,并调用对象的方法。
| 1Namespace ReflectionExample 2{ 3 class Class1 4 { 5 [STAThread] 6 static void Main (string [ ] args) 7 { 8 System.Console.WriteLine(“列出程序集中的所有类型”); 9 Assembly a = Assembly.LoadFrom (“ReflectionExample.exe”); 10 Type[ ] mytypes = a.GetTypes( ); 11 12 Foreach (Type t in mytypes) 13 { 14 System.Console.WriteLine ( t.Name ); 15 } 16 System.Console.ReadLine ( ); 17 System.Console.WriteLine (“列出HellWord中的所有方法” ); 18 Type ht = typeof(HelloWorld); 19 MethodInfo[] mif = ht.GetMethods(); 20 foreach(MethodInfo mf in mif) 21 { 22 System.Console.WriteLine(mf.Name); 23 } 24 System.Console.ReadLine(); 25 System.Console.WriteLine("实例化HelloWorld,并调用SayHello方法"); 26 Object obj = Activator.CreateInstance(ht); 27 string[] s = {"zhenlei"}; 28 Object bojName = Activator.CreateInstance(ht,s); 29 BindingFlags flags = (BindingFlags.NonPublic|BindingFlags. Public|BindingFlags.Static|BindingFlags.Instance|BindingFlags. DeclaredOnly); 30 MethodInfo msayhello = ht.GetMethod("SayHello"); 31 msayhello.Invoke(obj,null); 32 msayhello.Invoke(objName,null); 33 System.Console.ReadLine(); 34 } 35 } 36} 1using System; 2namespace ReflectionExample 3{ 4 public class HelloWorld 5 { 6 string myName = null; 7 public HelloWorld(string name) 8 { 9 myName = name; 10 } 11 public HelloWorld() : this(null) 12 {} 13 public string Name 14 { 15 get 16 { 17 return myName; 18 } 19 } 20 public void SayHello() 21 { 22 if(myName == null) 23 { 24 System.Console.WriteLine("Hello World"); 25 } 26 else 27 { 28 System.Console.WriteLine("Hello," + myName); 29 } 30 } 31 } 32} 33 |
采用反射技术可以简化工厂的实现。
(1)工厂方法:通过反射可以将需要实现的子类名称传递给工厂方法,这样无须在子类中实现类的实例化。
(2)抽象工厂:使用反射可以减少抽象工厂的子类。
采用反射技术可以简化工厂代码的复杂程度,在。NET项目中,采用反射技术的工厂已经基本代替了工厂方法。
采用反射技术可以极大地简化对象的生成,对以下设计模式的实现也有很大影响。
(1)命令模式:可以采用命令的类型名称作为参数直接获得命令的实例,并且可以动态执行命令。
(2)享元模式:采用反射技术实例化享元可以简化享元工厂。
2 委托技术与设计模式
委托技术是。NET引入的一种重要技术,使用委托可以实现对象行为的动态绑定,从而提高设计的灵活性。
2.1 .NET中的委托技术
。NET运行库支持称为“委托”的引用类型,其作用类似于C++中的函数指针。与函数指针不同,委托实例独立于其封装方法的类,主要是那些方法与委托类型兼容。另外,函数指针只能引用静态函数,而委托可以引用静态和实例方法。委托主要用于。NET Framework中的事件处理程序和回调函数。
所有委托都从System.Delegate继承而来并且有一个调用列表,这是在调用委托时所执行方法的一个链接列表。产生的委托可以用匹配的签名引用任何方法,没有为具有返回类型并在调用列表中包含多个方法的委托定义返回值。
可以使用的委托Cimbine及Remove方法在其调用列表中添加和移除方法。若要调用委托,可使用Invoke方法,或者使用BeginInvoke和EndInvoke方法异步调用委托。委托类的实现由运行库提供,而不由用户代码提供。
委托适用于那种在某些语言中需要用函数指针来解决的情况,但是与函数指针不同,它是面向对象和类型安全的。
委托声明定义一个类,它是从System.Delegate类派生的类。委托实例封装了一个调用列表,其中列出了一个或多个方法,每个方法称为一个可调用实体。对于实例方法,可调用实体由一个实例和该实例的方法组成;对于静态方法,可调用实体仅由一个方法组成。如果用一组合适的参数来调用一个委托实例,则该委托实例所封装的每个可调用实体都会被调用,并且使用上述同一组参数。
委托实例的一个有用的属性是它既不知道,也不关心其封装方法所属类的详细信息,对它来说最重要的是这些方法与该委托的类型兼容。即只要方法的返回类型和参数表是相同的,则方法与委托类型兼容,方法的名称不一定要与委托类相同。
- 本文关键词:

