Передача делегата в качестве параметра метода

В настоящее время я разрабатываю класс 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;