zoukankan      html  css  js  c++  java
  • 反射(3)反射应用:一个插件项目

      前面总结了反射的使用,这一篇结合一个完整的项目来总结下反射的实际应用。

    项目结构

    如下图:

    定义插件接口

    在项目ConsoleApplication6.IService中,定义了两个接口,Run代表行驶,Trun代表转向,如下代码:

     1 namespace ConsoleApplication6.IService
     2 {
     3     /// <summary>
     4     /// 创建一个车的接口
     5     /// </summary>
     6     public interface ICarService
     7     {
     8         /// <summary>
     9         /// 行驶
    10         /// </summary>
    11         void Run();
    12 
    13         /// <summary>
    14         /// 转向
    15         /// </summary>
    16         /// <param name="direction"></param>
    17         void Turn(Direction direction);
    18 
    19     }
    20 
    21     public enum Direction
    22     {
    23         East,
    24         Weast,
    25         South,
    26         North
    27     }
    28 }

    插件程序实现

    这里新建了两个项目分别实现插件程序,分别是ConsoleApplication6.Service.BMW和ConsoleApplication6.Service.BenZ,代码如下:

     1 namespace ConsoleApplication6.Service.BMW
     2 {
     3     public class BMWCarService: ICarService
     4     {
     5         /// <summary>
     6         /// 行驶
     7         /// </summary>
     8         public void Run()
     9         {
    10             Console.WriteLine("BMW Car Run!");
    11         }
    12 
    13         /// <summary>
    14         /// 转向
    15         /// </summary>
    16         /// <param name="direction"></param>
    17         public void Turn(Direction direction)
    18         {
    19             Console.WriteLine(string.Format("BMW Car turn:{0}", direction.ToString()));
    20         }
    21     }
    22 }
     1 namespace ConsoleApplication6.Service.BenZ
     2 {
     3     public class BenZCarService: ICarService
     4     {
     5         /// <summary>
     6         /// 行驶
     7         /// </summary>
     8         public void Run()
     9         {
    10             Console.WriteLine("BenZ Car Run!");
    11         }
    12 
    13         /// <summary>
    14         /// 转向
    15         /// </summary>
    16         /// <param name="direction"></param>
    17         public void Turn(Direction direction)
    18         {
    19             Console.WriteLine(string.Format("BenZ Car turn:{0}", direction.ToString()));
    20         }
    21     }
    22 }

    运行程序

    接下来我们就可以利用反射来运行这个插件程序了,如下代码:

     1 namespace ConsoleApplication6
     2 {
     3     class Program
     4     {
     5         static void Main(string[] args)
     6         {
     7             var assembly = Assembly.Load("ConsoleApplication6.Service.BMW");//也可以从配置文件中读取
     8             var t = assembly.GetType("ConsoleApplication6.Service.BMW.BMWCarService");//也可以从配置文件中读取
     9 
    10             //创建一辆车的实例
    11             var obj = Activator.CreateInstance(t);
    12             ICarService car = obj as BMWCarService;
    13             if (car != null)
    14             {
    15                 car.Run();
    16                 car.Turn(Direction.East);
    17             }
    18 
    19             Console.ReadKey();
    20         }
    21     }
    22 }

    这样,一个简单的插件程序就完成了,同时,如果我们开发类似的插件框架,就会大量使用到反射技术。

  • 相关阅读:
    retain和copy的区别 #import @class 的区别
    UImageview加边框 加阴影
    iOS中有两种支持机制:Notification和KVO(KeyValue Observing)
    Windows上编译,学习Objectivec
    CAAnimation动画
    ObjectiveC 熟记小概念
    cocos2d工具大全
    cocos2d 0.99.5版本屏幕默认是横屏,怎么修改为竖屏呢?
    ObjectiveC 的 self 和 super 详解
    ObjectiveC 的属性与合成方法使用详解
  • 原文地址:https://www.cnblogs.com/mcgrady/p/7001236.html
Copyright © 2011-2022 走看看