オブジェクトが独自のイベントを発生させるために使用できる拡張メソッドを試しています。
ほぼ希望どおりに機能していますが、渡された引数をActivatorに頼らずにEventArgsのコンストラクター引数に変換できるように改善できるかどうかを知りたいと思います。
これが可能かどうかは疑わしいと前もって言いますが、他の人が持っているコーディングのトリックに本当に驚かされることがあるので、試してみるつもりです...
void Main()
{
var c = new C();
c.E += (s, e) => Console.WriteLine (e.Message);
c.Go();
}
public class C
{
public event EventHandler<Args> E;
public void Go()
{
Console.WriteLine ("Calling event E...");
// This version doesn't know the type of EventArgs so it has to use Activator
this.Fire(E, "hello");
// This version doesn't know ahead of time if there are any subscribers so it has to use a delegate
this.Fire(E, () => new Args("world"));
// Is there some way to get the best of both where it knows the type but can delay the
// creation of the event args?
//this.Fire<Args>("hello");
}
}
public class Args : EventArgs
{
public Args(string s)
{
Message = s;
}
public string Message { get; set; }
}
public static class Ext
{
public static void Fire<T>(this object source, EventHandler<T> eventHander, Func<T> eventArgs) where T : EventArgs
{
if (eventHander != null)
eventHander(source, eventArgs());
}
public static void Fire<T>(this object source, EventHandler<T> eventHander, params object[] args) where T : EventArgs
{
if (eventHander != null)
eventHander(source, (T)Activator.CreateInstance(typeof(T), args));
}
}