2009-02-15 19 views
6

No tengo ninguna experiencia en F # pero tengo unas pocas líneas de código de prueba en C# para un marco que he creado que necesito reescribir en F #.Eventos y delegados en F #

Cualquier ayuda sería apreciada.

bar.Ready += new Agent.ReadyHandler(bar_Ready);    

    static void bar_Ready(string msg) 
    {  
     Console.WriteLine(msg.body); 
    } 

Respuesta

4

He jugado mucho con esto y este es el código que funciona.

bar.add_Ready(fun msg -> Console.WriteLine(msg)) 

No sé cuán teóricamente correcto es, pero funciona bien.

¿Puede alguien confirmar que es correcto?

+1

Hola, esto es correcto. Desafortunadamente F # no se comporta tan bien para todos los delegados. Creo que si su delegado siguiera el patrón .NET estándar (XyzEventHandler taking object y XyzEventArgs), las soluciones descritas anteriormente también funcionarían. –

+0

BTW: si usted es el autor del tipo de delegado y desea utilizarlo solo desde F #, puede considerar el uso de funciones en lugar de delegados. –

+0

@Tomas Petricek: el marco en sí mismo del que proviene el delegado está en C#. – Ali

6

Prueba esto -

bar.Ready.AddHandler(new Agent.ReadyHandler (fun sender msg -> System.Console.WriteLine(msg))) 
+0

o incluso más corto: bar.Ready.AddHandler (diversión sender msg -> System.Console.WriteLine (msg)) –

+0

Tenga en cuenta que los delegados en F # no agregan los métodos 'BeginInvoke' y 'EndInvoke'. –

+1

Lo mismo que aquí aparece: "El evento 'Ready tiene un tipo de delegado no estándar y se debe acceder utilizando los métodos explícitos add_Ready y remove_ready para el evento.", ¿Alguna idea de por qué? – Ali

9

sólo para aclarar - la versión más corta debe ser correctamente:

bar.Ready.Add(fun msg -> System.Console.WriteLine(msg)) 

Debido F # no convierte automáticamente las funciones lambda a los delegados - pero hay un método Add que toma una función. Esto se puede escribir aún más simple como esto:

bar.Ready.Add(System.Console.WriteLine) 

Debido F # permite el uso de miembros de .NET como funciones de primera clase.

+1

Aparece el error: El evento 'Listo tiene un tipo de delegado no estándar y se debe acceder utilizando los métodos explícitos add_Ready y remove_ready para el evento. – Ali

Cuestiones relacionadas