zoukankan      html  css  js  c++  java
  • C#利用反射动态绑定事件

    大多数时都是强类型,直接绑定事件,但这种耦合关系太强,在动态调用Dll的时候就不太合适了。

    以下是动态绑定和直接绑定的一个简单实例:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Threading.Tasks;
      6 //
      7 using System.Reflection;
      8 
      9 namespace 反射绑定事件及方法
     10 {
     11     class Program
     12     {
     13         static void Main(string[] args)
     14         {
     15             //普通绑定事件实例
     16             NormalBindingEvent();
     17 
     18             //反射绑定事件实例
     19             ReflectionBindingEvent();
     20 
     21             //控制台提示
     22             ConsoleTips();
     23         }
     24 
     25         /// <summary>
     26         /// 反射绑定事件
     27         /// </summary>
     28         static void ReflectionBindingEvent()
     29         {
     30             var customerRef = new CustomerClass();
     31             EventInfo evtInfo = customerRef.GetType().GetEvent("MyEvent", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
     32             evtInfo.AddEventHandler(customerRef, new EventHandler(CustomerObj_CustomerEvent));
     33 
     34             //触发事件,传递参数
     35             customerRef.TirggerEvent("hello 我是反射绑定");
     36         }
     37 
     38         /// <summary>
     39         /// 常规的事件绑定处理
     40         /// </summary>
     41         static void NormalBindingEvent()
     42         {
     43             var CustomerObj = new CustomerClass();
     44             CustomerObj.MyEvent += new EventHandler(CustomerObj_CustomerEvent);
     45 
     46             //触发事件,传递参数
     47             CustomerObj.TirggerEvent("Hello 我的常规绑定");
     48         }
     49 
     50         static void CustomerObj_CustomerEvent(object sender, EventArgs e)
     51         {
     52             string msg = ((myEventArgs)e).StrInfo;
     53             Console.WriteLine("事件已被触发,接受到参数:{0}", msg);
     54         }
     55 
     56 
     57 
     58         static void ConsoleTips()
     59         {
     60             Console.WriteLine(" ");
     61             Console.Write("请按任意键退出...");
     62             Console.ReadKey();
     63         }
     64     }
     65 
     66     public class CustomerClass
     67     {
     68 
     69         /// <summary>
     70         /// 自定义事件
     71         /// </summary>
     72         public event EventHandler MyEvent;
     73 
     74         //触发事件的方法
     75         /// <summary>
     76         /// 
     77         /// </summary>
     78         /// <param name="info"></param>
     79         public void TirggerEvent(string info)
     80         {
     81             if (MyEvent != null)
     82             {
     83                 EventArgs eArg = new myEventArgs(info);
     84                 MyEvent(this, eArg);
     85             }
     86         }
     87     }
     88 
     89     //声明事件信息类型,并继承于EventArgs
     90     class myEventArgs : EventArgs
     91     {
     92         public myEventArgs(string strinfo)
     93         {
     94             this.strinfo = strinfo;
     95         }
     96         private string strinfo;
     97         public string StrInfo
     98         {
     99             get { return strinfo; }
    100         }
    101     }
    102 }
    代码
  • 相关阅读:
    数据库MySQL调优实战经验总结
    Apache常见功能实战详解
    使用HeartBeat实现高可用HA的配置过程详解
    Nginx实现集群的负载均衡配置过程详解
    CentOS系统通过PXE实现批量无人值守安装
    CentOS 7 网卡命名修改为eth0格式
    Nagios 系统监控基本安装配置过程详解
    LAMP 系统服务搭建过程详解
    使用 python 管理 mysql 开发工具箱
    C++标准库string类型的使用和操作总结
  • 原文地址:https://www.cnblogs.com/Maculish/p/5038705.html
Copyright © 2011-2022 走看看