以下のメソッドは、派生クラスがイベントによって通知される必要があるオブジェクトを指定できるようにする基本クラスの一部です。匿名メソッドのターゲットを取得する
protected void RaiseEvent<TEventArgs>(EventHandler<TEventArgs> updateEvent, TEventArgs eventArgs, UpdateReceivers updateReceivers)
where TEventArgs : EventArgs
{
EventHandler<TEventArgs> handler = updateEvent;
if (handler != null)
{
if (updateReceivers.ToAllSubscribers)
{
handler(this, eventArgs);
}
else
{
NotifySpecifiedReceiver(handler, eventArgs, updateReceivers.Receiver);
}
}
}
private void NotifySpecifiedReceiver<TEventArgs>(EventHandler<TEventArgs> handler, TEventArgs eventArgs, object updateReceiver)
where TEventArgs : EventArgs
{
foreach (Delegate @delegate in handler.GetInvocationList())
{
// is the delegates target our receiver?
// but this doesnt work for anonymous methods :(
if (@delegate.Target == updateReceiver)
{
try
{
@delegate.DynamicInvoke(this, eventArgs);
}
catch (Exception ex)
{
}
}
}
}
のみ特定の受信機に通知するために、この方法は、このように使用されている:
event EventHandler<SomethingChangedEventArgs> SomethingChanged;
RaiseEvent(SomethingChanged, args, UpdateReceivers.Single(receiver));
これは受信機に「ポインティング」デリゲートを上昇させる(受信機はもちろん加入しなければなりません) 。
私の悩みは、匿名メソッドを使用してSomethingChangedイベントを購読し、このイベントを使用して購読しているオブジェクトに通知するときに問題が発生することです。
class EventConsumer
{
private EventSource _eventSource;
private void SubscribeEvents()
{
// ReactOnEvent() will not be called because the check [@delegate.Target == updateReceiver] doesnt work for anonymous methods
_eventSource.MyStateChanged += (sender, e) => ReactOnEvent();
_eventSource.PublishCurrentState(this);
}
}
class EventSource
{
// multiple objects are subscribed to this event
event EventHandler<MyStateChangedEventArgs> MyStateChanged;
public void GetCurrentState(object receiver)
{
// receiver ask for the current state, only raise event for him
RaiseEvent(MyStateChanged, args, UpdateReceivers.Single(receiver));
}
}
匿名メソッドを含むインスタンスを取得することは可能ですか?または私は私の問題を解決するために完全に異なるアプローチを使用すべきですか?
あなたは 'DynamicInvoke'を呼び出すべきではありません。 – SLaks
デリゲートを呼び出す別の方法はありますか? – leozilla
'@delegate(this、eventArgs)'型指定されていないデリゲートには 'DynamicInvoke'が必要です。 (これはメソッドを呼び出すためにリフレクションを使用します) – SLaks