透過委派來新增事件

  • 40
  • 0
  • 2016-03-27

Delegate EventHandler 用法 

參考這篇

事件的深入分析(function pointer, delegate, event, EventHandler)

http://johnniebooks.blogspot.tw/2011/02/function-pointer-delegate-event.html


透過Delegate指派給物件的事件

達到在主程式時動態新增函式的目的

其中函式可為具名或匿名的

方法:

在物件內宣告 public delegate void [EventHandlerName] (object sender,EventArgs e);

參數是固定的,事件名字可以自己取

宣告 public event [EventHandlerName] [EventObject];

讓該物件可以使用該事件

在主程式裡撰寫匿名或具名函式

透過 += -= 來新增或刪除該事件下的函式

程式會依據註冊順序執行該物件的事件

程式碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DelegateTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Agent agent1=new Agent();
            agent1.EndEvent += OtherMedthod;
            //匿名委派
            agent1.EndEvent+= delegate (object sender,EventArgs e)
            {
                string name= sender as string;
                Console.WriteLine("---"+name+"---END---");
            };
            Console.WriteLine("MainStart");
            agent1.Send("Tony");
            Console.WriteLine("MainEnd");
            
        }
        //具名委派
        static void OtherMedthod(object sender, EventArgs e)
        {
            string name = sender as string;
            Console.WriteLine("---" + name + "---PLAY---");
        }
    }
    class Agent
    {
        //宣告一個EventHandler,名稱自取,參數固定
        public delegate void EndEventHandler (object sender,EventArgs e);
        //宣告一個EndEventHandler,方便後續程式使用
        public event EndEventHandler EndEvent;
        public Agent()
        {
            
        }
        public void Send(string content)
        {
            Console.WriteLine("Send Message.");
            //確認EventHandler有被委派
            if(EndEvent!=null)
                EndEvent.Invoke(content,null);
        }
    }
}

程式碼結果