Передача делегата в качестве параметра метода - PullRequest
6 голосов
/ 15 октября 2010

В настоящее время я занимаюсь разработкой класса EventManager для обеспечения того, чтобы никакие события не оставались связанными с мертвыми дуплексными клиентами WCF, а также для контроля предотвращения множественной проводки от одного клиента к одному событию.

Теперь, по сути,Я застрял, пытаясь передать делегат события функции, которая будет управлять назначением следующим образом.

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 Ответ

5 голосов
/ 15 октября 2010

Используйте модификатор параметра 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...