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 }

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

  • 相关阅读:
    年近30,朋友聚会都聊什么?
    2016世界最热门的编程语言与薪资揭秘
    程序员的春天来了,最美赏花旅游地十大攻略
    雄联盟工程师独家分享:如何使开发更有效率
    小偷被抓叫嚣:我不偷警察没饭吃
    3.7女生节:被程序员男友送的奇葩礼物宠哭了
    最适合程序员加班吃的6大营养美食
    谷歌汽车出误判曝光 6大奇葩科技更牛
    【程序员的爱情】彼岸花开谁又种下了执念
    分享10个免费或便宜的Photoshop替代工具
  • 原文地址:https://www.cnblogs.com/mcgrady/p/7001236.html
Copyright © 2011-2022 走看看