现在的位置: 首页 > 综合 > 正文

解读C#中的事件转嫁

2013年08月03日 ⁄ 综合 ⁄ 共 2695字 ⁄ 字号 评论关闭

 /// <summary>
 /// 事件转嫁类
 /// </summary>
 public class EventDeliver
 {
             /// <summary>
             /// 转嫁事件
             /// </summary>
             /// <param name="eventDeclareObject">原始事件包含对象</param>
             /// <param name="eventDeclareName">原始事件名称</param>
             /// <param name="eventHandleObject">目标事件响应对象</param>
             /// <param name="eventHandleName">目标事件响应方法</param>
             public static void Deliver(object eventDeclareObject,string eventDeclareName,object eventHandleObject, string eventHandleName)
             {
                          EventInfo eventInfo = eventDeclareObject.GetType().GetEvent(eventDeclareName,BindingFlags.Instance |BindingFlags.Static | BindingFlags.Public);
                          if (eventInfo == null)
                          {
                                       throw new ArgumentException();
                          }
                          if (eventInfo.GetAddMethod().IsStatic || eventInfo.GetRemoveMethod().IsStatic)
                          {
                                       throw new ArgumentException();
                          }            
                          Delegate handlerDelegate = Delegate.CreateDelegate(eventInfo.EventHandlerType,eventHandleObject,eventHandleName);
   eventInfo.AddEventHandler(eventDeclareObject,handlerDelegate);
             }
  
 }
 /// <summary>
 /// 事件响应
 /// </summary>
 public class EventHandleObject
 {
             public void InvokerEventHandler(object sender, EventArgs e)
             {
                          Console.WriteLine("转嫁事件响应方法被调用");
             }
 }
 /// <summary>
 /// 事件源
 /// </summary>
 public class EventSourceObject
 {
             public event EventHandler SharpnessDotNetCallMe;
             public void FireEvent()
             {
                          SharpnessDotNetCallMe(null,null);
             }
 }
 
 class Application
 {
             [STAThread]
             static void Main(string[] args)
             {
                          //原始方法
                          EventSourceObject sender1 = new EventSourceObject();
                          sender1.SharpnessDotNetCallMe += new EventHandler(sender1_SharpnessDotNetCallMe);   
                          sender1.FireEvent();//触发事件
                          //转嫁方法
                          EventSourceObject sender2 = new EventSourceObject();
                          EventHandleObject handler = new EventHandleObject();
                          EventDeliver.Deliver(sender2,"SharpnessDotNetCallMe",handler,"InvokerEventHandler"); 
                          //触发事件
                          sender2.FireEvent();
                          Console.Read();
             }
             private static void sender1_SharpnessDotNetCallMe(object sender, EventArgs e)
             {
                          Console.WriteLine("原始事件响应方法被调用");
             }
 }

//输出效果

抱歉!评论已关闭.