2009-01-29 6 views
5

Posso creare dinamicamente una funzione e invocarla (passare valori in essa) in una riga di codice?Creare una funzione e chiamarla in una riga del codice C#

Chiarimento: Stavo cercando un modo che mi consenta di creare una funzione anonima e quindi chiamarla direttamente. Ordina:

delegate(string aa){ MessageBox.show(aa); }("Hello World!"); 

o qualcosa del genere (so che il codice precedente non viene compilato, ma volevo qualcosa di simile).

+0

Si prega di spiegare perché si vuole fare questo. –

+1

Non voglio ingombrare l'intestazione della mia classe introducendo un'altra dichiarazione. –

+0

Perché non usare semplicemente un vecchio codice inline? Inoltre non riesco a capire come un metodo privato possa essere un grosso problema. –

risposta

17
new Action<int>(x => Console.WriteLine(x))(3); 

non è così leggibile, ma rispondendo alla tua domanda, è assolutamente possibile.

EDIT: appena notato hai contrassegnato come C# 2.0, la risposta di cui sopra è per 3,5, per 2,0 sarebbe

new Action<int>(delegate(int x) { Console.WriteLine(x); })(3); 
+0

Grazie .. sembra esserci un piccolo errore però ... Non dovrebbe essere una nuova azione (delegato (stringa x) {Console.WriteLine (x)}). Invoke ("Hello World"); // Ho usato il delegato invece. –

+0

in 3.5 opere (l'ho controllato), in 2.0 devi scrivere come hai suggerito –

+0

ok visto che è taggato C# 2.0 Ho risolto la mia risposta –

1

Per creare un anonimo utilizzare il metodo delegato:

delegate(...your arguments...) { ...your code... }; 

Edit: Dopo che la questione è stata rivista pablitos risposta è più precisa.

+0

Per votare a rovescio una risposta non corretta DOPO che la domanda è stata rivista/modificata, a mio parere non è come dovrebbe funzionare la votazione. –

+0

@CKret: benvenuto su Internet, dove le persone ti invidiano senza una ragione, tutto il tempo! ;) Ho svalutato la tua risposta però. –

+0

Grazie e grazie. ;) –

8

Il .Invoke non è effettivamente necessario; si può solo scrivere:

new Action<int>(x => Console.WriteLine(x))(3); 

o per C# 2.0:

new Action<int>(delegate(int x) { Console.WriteLine(x); })(3); 
+0

bella, non lo sapevo. –