我们继续C#基础知识的学习,这篇文章对前面基础知识学习的朋友有着举足轻重的作用;为了延续基础知识学习的热情,我编写了这篇特殊的文章。

本篇文章的中心是想借“.NET简谈反射(动态调用)”一文继续发挥下去,让朋友能一气呵成,到底反射能用在什么地方,究竟能起到多么高级的作用。

下面我就拿具体的例子讲解,不废话了请随我来;

1:必须具备的基础知识

C#接口:要想用反射进行高深的使用,必须先具备接口方面的基础,只有用接口了才能是系统真真的活起来。参考.NET简谈接口 一文;

C#委托、事件:在动态调用的过程中,我们难免要进行一些数据的传递,这样的传递是要用接口进行传递,我们不可能强耦合。参考.NET简谈事件与委托一文;

C#反射:这是最关键的一点,所有的东西都是围绕这个点在转,在我们下面的示例中,我们要动态的使用反射获取接口对象。参考.NET简谈反射(动态调用) 一文;

2:示例内容介绍

示例的主要内容是围绕着我们前面所学习的基础知识的做统一应用,以巩固我们的基础,使我们能在真正的项目中灵活运用,将自己提升到一个新的高度;

都知道接口是规范,都知道事件委托,都知道反射,但是我们都只是知道这些零零散散的知识点,我们怎么将这些小技术穿起来,形成坚实的代码结构;

示例要进行讲解的大概内容是这样的:我们定义一个接口,然后用对象去实现它,在我们使用的时候,我们动态的通过反射的去调用,但是反射的时候,我需要用接口进行确定唯一性,因为我们更本不知道谁实现了接口,所以接口的好处就出来了;

3:开始示例学习

定义接口:


  
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.  
  5. namespace MainInterface  
  6. {  
  7.     /// <summary>  
  8.     /// 成功计算后的委托  
  9.     /// </summary>  
  10.     /// <param name="count">返回计算后的值</param>  
  11.     public delegate void AddHandler(int count);  
  12.     /// <summary>  
  13.     /// 添加方法接口  
  14.     /// </summary>  
  15.     public interface AddInterface  
  16.     {  
  17.  
  18.         /// <summary>  
  19.         /// 计算结束后的事件  
  20.         /// </summary>  
  21.         event AddHandler AddEndEvent;  
  22.         /// <summary>  
  23.         /// 计算两个数的和  
  24.         /// </summary>  
  25.         /// <param name="i">number1</param>  
  26.         /// <param name="j">number2</param>  
  27.         void add(int i, int j);  
  28.     }  
  29. }  

实现接口:


  
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.  
  5. namespace TestDll  
  6. {  
  7.     public class Math : MainInterface.AddInterface  
  8.     {  
  9.  
  10.         #region AddInterface 成员  
  11.  
  12.         public event MainInterface.AddHandler AddEndEvent;  
  13.  
  14.         public void add(int i, int j)  
  15.         {  
  16.             AddEndEvent(i + j);  
  17.         }  
  18.  
  19.         #endregion  
  20.     }  
  21. }  

具体调用:


  
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Reflection;  
  5. using System.Diagnostics;  
  6.  
  7. namespace Reflection  
  8. {  
  9.     class Program  
  10.     {  
  11.         static void Main(string[] args)  
  12.         {  
  13.             Assembly dll = Assembly.LoadFile(Environment.CurrentDirectory + "\\TestDll.dll");  
  14.  
  15.             foreach (Type type in dll.GetTypes())  
  16.             {  
  17.                 if (type.GetInterface("MainInterface.AddInterface") != null)  
  18.                 {  
  19.                     MainInterface.AddInterface add = Activator.CreateInstance(type, trueas MainInterface.AddInterface;  
  20.                     add.AddEndEvent += new MainInterface.AddHandler(add_AddEndEvent);  
  21.                     add.add(10, 20);  
  22.  
  23.  
  24.                 }  
  25.             }  
  26.  
  27.         }  
  28.  
  29.         static void add_AddEndEvent(int count)  
  30.         {  
  31.  
  32.             Console.WriteLine("Invoke Method:\n" + count.ToString());  
  33.  
  34.             Console.ReadLine();  
  35.         }  
  36.     }  
  37. }  

总结:所谓麻雀虽小,五脏俱全;上面的示例代码虽然没什么作用,但是基本上能概括我们日常所用到的;这也是我们进入框架开发、系统开发必经之路;