カスタムイベントを作る

このページの自分メモ
方法 : .NET Framework ガイドラインに準拠したイベントを発行する

WithDataCustomEventArgs.cs(カスタムイベントがデータ通信を行う場合のみ必要)

using System;

namespace EventDemo
{
    /// <summary>
    /// データ送信を行うカスタムイベント
    /// </summary>
    class WithDataCustomEventArgs :EventArgs
    {
        private string _message;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="s">イベントが送信するメッセージ</param>
        public WithDataCustomEventArgs(string s)
        {
            _message = s;
        }

        /// <summary>
        /// イベントが送信するメッセージ
        /// </summary>
        public string Message
        {
            get { return _message; }
        }
    }
}

EventPublisher.cs(イベント定義クラス兼イベント発生クラス)

using System;

namespace EventDemo
{
    class EventPublisher
    {
        #region データ送信を行わないカスタムイベント
        /// <summary>
        /// データ送信を行わないカスタムイベント
        /// System 名前空間内に既に宣言されているEventHandlerデリゲート
        /// 「public delegate void EventHandler (Object sender,EventArgs e)」
        /// を使用するためデリゲートの宣言は不要
        /// </summary>
        public event EventHandler RaiseNoDateCustomEvent;

        /// <summary>
        /// 派生クラスにイベント発生時の挙動のオーバーライドを許可するため
        /// protected virtual メソッドにカプセル化
        /// </summary>
        protected virtual void OnNoDataCustmEvent(EventArgs args)
        {
            ///下記のnullチェックの直後かつイベント発生の直前に
            ///イベントのハンドラがnullに設定された場合を考慮し
            ///ハンドラの一時コピーを作成
            EventHandler handler = RaiseNoDateCustomEvent;

            //イベントのハンドラが割り当てられていない場合はイベントを発生させない
            if (handler != null)
            {
                //イベント発生
                handler(this, args);
            }
        }

        /// <summary>
        /// RaiseNoDateCustomEventを発生
        /// </summary>
        public void FireNoDataCustmEvent()
        {
            //イベント発生
            OnNoDataCustmEvent(new EventArgs());
        }
        #endregion



        #region データ送信を行うカスタムイベント(非ジェネリック バージョンの EventHandler を使用)
        /// <summary>
        /// データ送信を行うカスタムイベント(非ジェネリック バージョンの EventHandler を使用)のハンドラ(デリゲート)
        /// </summary>
        public delegate void WithDataByNonGenericCustomEventHandler (object sender, WithDataCustomEventArgs args);

        /// <summary>
        /// データ送信を行うカスタムイベント(非ジェネリック バージョンの EventHandler を使用)
        /// 上記で宣言したハンドラ(デリゲート)WithDataByNonGenericCustomEventHandlerを使用
        /// </summary>
        public event WithDataByNonGenericCustomEventHandler RaiseWithDataNonGenericCustomEvent;

        /// <summary>
        /// 派生クラスにイベント発生時の挙動のオーバーライドを許可するため
        /// protected virtual メソッドにカプセル化
        /// </summary>
        protected virtual void OnWithDataNonGenericCustomEvent(WithDataCustomEventArgs args)
        {
            ///下記のnullチェックの直後かつイベント発生の直前に
            ///イベントのハンドラがnullに設定された場合を考慮し
            ///ハンドラの一時コピーを作成
            WithDataByNonGenericCustomEventHandler handler = RaiseWithDataNonGenericCustomEvent;

            //イベントのハンドラが割り当てられていない場合はイベントを発生させない
            if (handler != null)
            {
                //イベント発生
                handler(this, args);
            }
        }

        /// <summary>
        /// WithDataNonGenericCustomEventを発生
        /// </summary>
        public void FireWithDataNonGenericCustomEvent()
        {
            string s = "非ジェネリック の EventHandler を使用したカスタムイベントのメッセージ";
            OnWithDataNonGenericCustomEvent(new WithDataCustomEventArgs(s));
        }
        #endregion



        #region データ送信を行うカスタムイベント(ジェネリック バージョンの EventHandler を使用)
        /// <summary>
        /// データ送信を行うカスタムイベント(ジェネリック バージョンの EventHandler を使用)
        /// System 名前空間内に既に宣言されているEventHandlerデリゲート
        /// 「public delegate void EventHandler<TEventArgs> 
        ///   (Object sender,TEventArgs e) 
        ///   where TEventArgs : EventArgs」
        /// を使用するため、デリゲートの宣言は不要
        /// </summary>
        public event EventHandler<WithDataCustomEventArgs> RaiseWithDataByGenericCustomEvent;

        /// <summary>
        /// 派生クラスにイベント発生時の挙動のオーバーライドを許可するため
        /// protected virtual メソッドにカプセル化
        /// </summary>
        protected virtual void OnWithDataGenericCustomEvent(WithDataCustomEventArgs args)
        {
            ///下記のnullチェックの直後かつイベント発生の直前に
            ///イベントのハンドラがnullに設定された場合を考慮し
            ///ハンドラの一時コピーを作成
            EventHandler<WithDataCustomEventArgs> handler = RaiseWithDataByGenericCustomEvent;

            //イベントのハンドラが割り当てられていない場合はイベントを発生させない
            if (handler != null)
            {
                //イベント発生
                handler(this, args);
            }
        }

        /// <summary>
        /// WithDataNonGenericCustomEventを発生
        /// </summary>
        public void FireWithDataGenericCustomEvent()
        {
            string s = "ジェネリック の EventHandler を使用したカスタムイベントのメッセージ";
            OnWithDataGenericCustomEvent(new WithDataCustomEventArgs(s));
        }
        #endregion
    }
}

メイン

using System;

namespace EventDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //イベント パブリッシャを初期化
            var publisher = new EventPublisher();

            //データ送信を行わないカスタムイベント
            publisher.RaiseNoDateCustomEvent += new EventHandler(publisher_RaiseNoDateCustomEvent);

            //データ送信を行うカスタムイベント(非ジェネリック バージョンの EventHandler を使用)
            publisher.RaiseWithDataNonGenericCustomEvent += new EventPublisher.WithDataByNonGenericCustomEventHandler(publisher_RaiseWithDataNonGenericCustomEvent);

            //データ送信を行うカスタムイベント(ジェネリック バージョンの EventHandler を使用)
            publisher.RaiseWithDataByGenericCustomEvent += new EventHandler<WithDataCustomEventArgs>(publisher_RaiseWithDataByGenericCustomEvent);

            //イベント発生
            publisher.FireNoDataCustmEvent();
            Console.WriteLine("\n-----------------------------------------------\n\n");
            publisher.FireWithDataNonGenericCustomEvent();
            Console.WriteLine("\n-----------------------------------------------\n\n");
            publisher.FireWithDataGenericCustomEvent();

#if DEBUG
            Console.ReadLine();
#endif
        }

        /// <summary>
        /// データ送信を行わないカスタムイベント
        /// </summary>
        static void publisher_RaiseNoDateCustomEvent(object sender, EventArgs args)
        {
            Console.WriteLine("データ送信を行わないカスタムイベント発生");
        }

        /// <summary>
        /// データ送信を行うカスタムイベント(非ジェネリック バージョンの EventHandler を使用)
        /// </summary>
        static void publisher_RaiseWithDataByGenericCustomEvent(object sender, WithDataCustomEventArgs args)
        {
            Console.WriteLine("データ送信を行うカスタムイベント発生:\n{0}", args.Message);
        }

        /// <summary>
        /// データ送信を行うカスタムイベント(ジェネリック バージョンの EventHandler を使用)
        /// </summary>
        static void publisher_RaiseWithDataNonGenericCustomEvent(object sender, WithDataCustomEventArgs args)
        {
            Console.WriteLine("データ送信を行うカスタムイベント発生:\n{0}", args.Message);
        }
    }
}

実行結果

データ送信を行わないカスタムイベント発生

-----------------------------------------------


データ送信を行うカスタムイベント発生:
非ジェネリック の EventHandler を使用したカスタムイベントのメッセージ

-----------------------------------------------


データ送信を行うカスタムイベント発生:
ジェネリック の EventHandler を使用したカスタムイベントのメッセージ