Chamar C # eventos de fora da classe possuir?
-
01-07-2019 - |
Pergunta
É possível em qualquer conjunto de circunstâncias para ser capaz de fazer isso?
As minhas circunstâncias atuais são o seguinte:
public class CustomForm : Form
{
public class CustomGUIElement
{
...
public event MouseEventHandler Click;
// etc, and so forth.
...
}
private List<CustomGUIElement> _elements;
...
public void CustomForm_Click(object sender, MouseEventArgs e)
{
// we might want to call one of the _elements[n].Click in here
// but we can't because we aren't in the same class.
}
}
Meu primeiro pensamento foi para ter uma função semelhante a:
internal enum GUIElementHandlers { Click, ... }
internal void CustomGUIElement::CallHandler(GUIElementHandler h, object[] args) {
switch (h) {
case Click:
this.Click(this, (EventArgs)args[0]);
break;
... // etc and so forth
}
}
É um remendo horrivelmente feia, mas ele deve funcionar ... Deve haver uma solução mais elegante embora? A biblioteca .NET faz isso o tempo todo com manipuladores de mensagem e chamando eventos no controle de. Alguém tem quaisquer outras idéias melhores /?
Solução
Você só precisa adicionar um método público para invocar o evento. Microsoft já faz isso para alguns eventos, como PerformClick para controles que expõem um Clique evento.
public class CustomGUIElement
{
public void PerformClick()
{
OnClick(EventArgs.Empty);
}
protected virtual void OnClick(EventArgs e)
{
if (Click != null)
Click(this, e);
}
}
Você, então, fazer o seguinte dentro do seu exemplo evento manipulador ...
public void CustomForm_Click(object sender, MouseEventArgs e)
{
_elements[0].PerformClick();
}
Outras dicas
A palavra-chave evento em c # modifica a declaração do delegado. Ela impede atribuição direta ao delegado (você só pode usar + = e - = em um evento)., Que impede a invocação do delegado de fora da classe
Assim, você poderá alterar seu código para algo como isto:
public class CustomGUIElement
{
...
public MouseEventHandler Click;
// etc, and so forth.
...
}
Em seguida, você pode chamar o evento de fora da classe como este.
myCustomGUIElement.Click(sender,args);
A desvantagem é que o código usando a classe pode substituir quaisquer manipuladores registrados muito facilmente com um código como este:
myCustomGUIElement.Click = null;
que não é permitido se o clique delegado é declarado como um evento.
Você realmente deve envolver o código que você deseja ser capaz de executar de fora para dentro de um método. Esse método pode, então, fazer o seu evento faria -. E aquele evento também em vez chamar esse método