2011-01-24 3 views
2

Я знаю, что могу передать подписку моего события к другому событию,Могу ли я делегировать событие и вызывать его также?

public event EventHandler MyEvent 
{ 
    add { SomeClass.AnotherEvent += value; } 
    remove { SomeClass.AnotherEvent -= value; } 
} 

В этом случае, если AnotherEvent повышено, то MyEvent будет повышена, а также.

Однако в моем классе я не могу поднять MyEvent() сам по себе, как обычно, потому что он говорит: Error 3 The event 'MyEvent' can only appear on the left hand side of += or -=

Я предполагаю, что это потому, что делегация подписки выше.

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

+0

С каким кодом вы пытаетесь поднять «MyEvent»? – TToni

+0

только некоторый код в моем методе, например 'MyEvent (this);' –

ответ

4

Да, вы можете - но вам понадобится ваша собственная переменная делегата. Вы можете либо подписаться на SomeClass.AnotherEvent один раз и называют свой собственный делегат при подъеме, что событие, или просто держать подписчиков дважды:

private EventHandler myEvent; 

public event EventHandler MyEvent 
{ 
    add 
    { 
     myEvent += value; 
     SomeClass.AnotherEvent += value; 
    } 
    remove 
    { 
     myEvent -= value; 
     SomeClass.AnotherEvent -= value; 
    } 
} 

Обратите внимание, что если вы идете для «подписаться на SomeClass.AnotherEvent раз» подход, вы можете хочу рассмотреть только подписка, когда вы впервые видите подписку на MyEvent и отписываете, когда myEvent становится null после отмены подписки. Все это может стать довольно сложным с точки зрения удаления ...

+0

by "подписаться на SomeClass.AnotherEvent once", вы имеете в виду ответы Пита и Акаша? –

+0

@ Луис: А Акаш, да. –

+0

ОК спасибо. Я тоже думал об их решениях, и я подумал, что это будет сложно, как вы сказали. Ваше решение не пришло мне в голову, и я думаю, что это намного лучше. Благодаря! –

1

Вы должны телеграфировать событие Вашей другой SomeClass .. В

// constructor or initializer.. 

SomeClass.AnotherEvent += (s,e)=>{ 
    if(MyEvent != null){ 
     MyEvent(s,e); 
    } 
}; 

// let this be implicit default event 
public event EventHandler MyEvent; 

protected void RaiseMyEvent(){ 
    if(MyEvent != null){ 
     MyEvent(this,EventArgs.Empty); 
    } 
} 
0

Вам нужно вызвать сам делегат, а не свойство события. Потому что MyEvent не имеет поля поддержки, это означает, что вам нужно будет вызвать фоновое поле SomeClass.AnotherEvent, которое (обычно) может делать только SomeClass. Как говорили другие, есть способы обойти это. Смотрите их ответы.

0

Я не думаю, что вы можете, и если бы вы могли, я не думаю, что это было бы логично. Поэтому я бы выполнил это событие нормально, а затем добавил обработчик событий в ваш класс, который будет прослушивать события из другого класса.

Вы в основном создаете класс, у которого есть событие, которое запускается, когда что-то происходит внутри класса, и что-то происходит в зависимом классе. Я считаю, что реализация должна отражать это. Например:

public MyClass() 
{ 
    this.other = new SomeClass; 
    other.AnotherEvent += SomeClass_AnotherEvent; 
} 
public event EventHandler MyEvent; 
private void SomeClass_AnotherEvent(object sender, EventArgs e) 
{ 
    if (MyEvent != null) 
     MyEvent(this, e); // I think that it would be most logical, that you do not pass the sender 
} 
Смежные вопросы