2009-05-14 2 views
13

Esiste un modo per creare un nuovo tipo di delegato basato su uno esistente? Nel mio caso, mi piacerebbe creare un delegato MyMouseEventDelegate che avrebbe le stesse funzionalità di EventHandler<MouseEventArgs>.Come posso creare un nuovo tipo di delegato basato su uno esistente, in C#?

Perché lo voglio? Per sfruttare il controllo del tipo in fase di compilazione, ovviamente! In questo modo, posso avere due diversi delegati: MyRightClickHandler e MyLeftClickHandler, e mai il twain deve essere confuso - anche se entrambi sono funzionalmente identici a EventHandler<MouseEventArgs>.

C'è sintassi per fare questo genere di cose?

Oh, e il codice come:

using MyRightClickHandler = EventHandler<MouseEventArgs> 

non è abbastanza buono. Non esegue alcun tipo di controllo, dal momento che in realtà non crea un nuovo tipo. E dovrei incollare una riga del genere in ogni file di codice in cui fare riferimento a MyRightClickHandler.

+1

Ho modificato il titolo per chiarire che si sta parlando di tipi di delegati, non di istanze delegate. Spero non ti dispiaccia. –

+0

Onorato! Grazie. – scraimer

risposta

10

Bene, è semplice come copiare la dichiarazione dei delegati dall'originale. Non c'è niente in C# per farlo automaticamente, ma non riesco a vedere è molto più di un fardello:

public delegate void MyLeftClickHandler(object sender, MouseEventArgs e); 
public delegate void MyRightClickHandler(object sender, MouseEventArgs e); 

Non è come MouseEventHandler sta per cambiare in qualunque momento presto ...

Avete effettivamente morso da errori dovuti all'utilizzo di delegati sbagliati nei posti sbagliati? Non ricordo di aver mai trovato questo problema da solo, e mi sembra che tu stia introducendo più lavoro (e un gruppo di delegati non familiare per altri sviluppatori) - sei sicuro che ne valga la pena?

+0

Wow. Credo che dovrei pensare e usare meglio il buon senso la prossima volta :-) – scraimer

+0

Non è un peso ma non consente il polimorfismo dei delegati. –

5

Se si desidera ottenere il controllo del tipo di tempo compilato, suppongo che sarebbe sufficiente creare classi EventArgs specializzate per i casi che si descrivono. In questo modo si può ancora usufruire dei delegati predefiniti:

class RightMouseButtonEventArgs : MouseEventArgs {} 
class LeftMouseButtonEventArgs : MouseEventArgs {} 

EventHandler<RightMouseButtonEventArgs> 
EventHandler<LeftMouseButtonEventArgs> 
4

No. Secondo la C# documentation, tipi delegati sono sigillati, e non è possibile creare un nuovo tipo delegato che eredita da uno esistente.

3

Non credevo jon-skeet. Dovevo provarlo per me stesso. Lui aveva ragione.

public void F(object sender, MouseEventArgs e) {}; 
public MyLeftClickHandler l; 
public MyRightClickHandler r; 
public void Test() 
{ 
    l = F; // Automatically converted. 
    r = F; // Automatically converted to a different type. 
    l = r; // Syntax error. Incompatible types. 
    l = new MyLeftClickHandler(r); // Explicit conversion works. 
} 

Non era ovvio!