Передача делегата в качестве параметра метода
В настоящее время я разрабатываю класс EventManager для обеспечения того, чтобы никакие события не оставались подключенными к мертвым клиентам WCF duplex, а также для управления предотвращением множественной проводки от одного клиента к одному событию.
Теперь в основном, я то, что застрял, пытается передать делегат события функции, которая будет управлять назначением, как это.
var handler = new SomeEventHandler(MyHandler);
Wire(myObject.SomeEventDelegate, handler);
называть это:
private void Wire(Delegate eventDelegate, Delegate handler)
{
// Pre validate the subscription.
eventDelegate = Delegate.Combine(eventDelegate, handler);
// Post actions (storing subscribed event delegates in a list)
}
обновление
код для SomeEventDelegate обертка:
public Delegate SomeEventDelegate
{
get { return SomeEvent; }
set { SomeEvent = (SomeEventHandler) value; }
}
event SomeEventHandler SomeEvent;
очевидно, что делегат не возвращается в myObject.SomeEventDelegate И я не могу вернуть делегат из метода, потому что мне тоже нужна некоторая проверка. У вас есть идеи, как это сделать?
1 ответов
использовать C# ref
модификатор параметра:
var handler = new SomeEventHandler(MyHandler);
Wire(ref myObject.SomeEventDelegate, handler);
private void Wire(ref Delegate eventDelegate, Delegate handler)
{
// Pre validate the subscription.
eventDelegate = Delegate.Combine(eventDelegate, handler);
// Post actions (storing subscribed event handlers in a list)
}
обратите внимание также, что существует некоторый хороший синтаксический сахар (начиная с C# 2.0) для назначения и объединения делегатов (см. в этой статье, например):
Wire(ref myObject.SomeEventDelegate, MyHandler);
private void Wire(ref Delegate eventDelegate, Delegate handler)
{
// Pre validate the subscription.
eventDelegate += handler;
// Post actions (storing subscribed event handlers in a list)
}
было указано, что ref
работает только с полями, а не со свойствами. В случае свойства может использоваться промежуточная переменная:
var tempDelegate = myObject.SomeEventDelegate;
Wire(ref tempDelegate, MyHandler);
myObject.SomeEventDelegate = tempDelegate;