さんぽみち

なにか思いついたときとかに気まぐれに更新されます。

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
続行するには何かキーを押してください . . .

きっちり落ちずに流してくれる!
ちょー便利!!