2009-05-14 14 views
13

¿Hay alguna manera de que pueda crear un nuevo tipo de delegado basado en uno existente? En mi caso, me gustaría crear un delegado MyMouseEventDelegate que tenga la misma funcionalidad que EventHandler<MouseEventArgs>.¿Cómo creo un nuevo tipo de delegado basado en uno existente, en C#?

¿Por qué quiero esto? Para aprovechar comprobaciones de tipos en tiempo de compilación, por supuesto! De esta forma, puedo tener dos delegados diferentes: MyRightClickHandler y MyLeftClickHandler, y nunca los dos estarán confundidos, incluso si ambos son funcionalmente idénticos a EventHandler<MouseEventArgs>.

¿Hay sintaxis para hacer este tipo de cosas?

Ah, y un código como:

using MyRightClickHandler = EventHandler<MouseEventArgs> 

no es lo suficientemente bueno. No hace ningún tipo de comprobación, ya que en realidad no crea un nuevo tipo. Y tendría que pegar esa línea en cada archivo de código en el que me referiría al MyRightClickHandler.

+1

He modificado el título para dejar en claro que está hablando de tipos de delegados, no delega instancias. Espero que no te importe. –

+0

Honorable! Gracias. – scraimer

Respuesta

10

Bueno, es tan simple como copiar la declaración delegada del original. No hay nada en C# para hacer esto automáticamente, pero no puedo ver que es gran parte de una carga:

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

No es como MouseEventHandler va a cambiar a corto plazo ...

¿Ha sido realmente ¿Mordido por errores debido al uso de los delegados equivocados en los lugares equivocados? No recuerdo haber encontrado esto como un problema, y ​​me parece que estás presentando más trabajo (y un grupo desconocido de delegados para otros desarrolladores). ¿Estás seguro de que vale la pena?

+0

Wow. Creo que debería pensar y usar mejor sentido común la próxima vez :-) – scraimer

+0

No es una carga, pero no permite el polimorfismo en los delegados. –

5

Lo único que desea es lograr la verificación del tipo de tiempo de compilación Supongo que bastará con crear clases especializadas EventArgs para los casos que usted describe. De esa manera usted todavía puede tomar ventaja de los delegados predefinidos:

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

EventHandler<RightMouseButtonEventArgs> 
EventHandler<LeftMouseButtonEventArgs> 
4

No. De acuerdo con la C# documentation, tipos de delegados están sellados, y no se puede crear un nuevo tipo de delegado que hereda de uno ya existente.

3

No creo jon-skeet. Tenía que intentarlo por mí mismo. Él estaba en lo correcto.

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. 
} 

¡Eso no era obvio!

Cuestiones relacionadas