C# EventArgsの継承とかイベントのnullチェックがめんどくさい
のでこんな拡張メソッド作ってみた、便利。
using System; ///<summary>汎用のEventArgsを生成するためのクラス</summary> public static class GenericEventArgs { public static GenericEventArgs<TArg> Create<TArg>(TArg arg) { return new GenericEventArgs<TArg>(arg); } } ///<summary>汎用のEventArgs</summary> ///<remarks>EventArgsを継承して指定された型の値を持つだけ</remarks> public class GenericEventArgs<TArg> : EventArgs { public TArg Value{ get; private set; } public GenericEventArgs(TArg arg) { this.Value = arg; } } ///<summary>デリゲートに関する拡張メソッド定義用クラス</summary> public static class DelegateExtensionMethods { ///<summary>素直なイベントハンラ型デリゲートの実行</summary> public static void Run( this EventHandler handler, object sender, EventArgs e ){ if(handler != null) { handler(sender, e); } } ///<summary>汎用イベントハンドラ型デリゲートの実行</summary> public static void Run<TEventArgs>( this EventHandler<TEventArgs> handler, object sender, TEventArgs e ) where TEventArgs : EventArgs { if(handler != null) { handler(sender, e); } } ///<summary>汎用EventArgsを用い、引数を生で渡して実行</summary> ///<remarks>EventArgsを継承するのが面倒で横着したいときに使う</remakrs> public static void Run<TArg>( this EventHandler<GenericEventArgs<TArg>> handler, object sender, TArg e ){ handler.Run(sender, GenericEventArgs.Create(e)); } }
使い方はこんな感じ。
using System; public class MainApp { [STAThread] public static void Main() { var eventRaiser = new EventRaiser(); Console.WriteLine("イベント未登録時にイベント発行"); eventRaiser.OnEvent("hoge"); Console.WriteLine("イベント登録"); eventRaiser.Event += (sender, e) => Console.WriteLine(e.Value); Console.WriteLine("イベント登録後にイベント発行"); eventRaiser.OnEvent("fuga"); } } public class EventRaiser { public event EventHandler<GenericEventArgs<string>> Event; public void OnEvent(GenericEventArgs<string> e) { this.Event.Run(this, e); } public void OnEvent(string e) { this.Event.Run(this, e); } }
結果はこんな感じ。
イベント未登録時にイベント発行 イベント登録 イベント登録後にイベント発行 fuga 続行するには何かキーを押してください . . .
きっちり落ちずに流してくれる!
ちょー便利!!