2010-03-31 13 views
18

Diciamo che voglio memorizzare un gruppo di puntatori funzione in un List<(*func)>, e poi chiamarli, magari anche con parametri ... Come se io memorizzassi in un Dict<(*func), object[] params> potrei chiamare il funziona con i parametri? Come lo farei?Come memorizzare un puntatore a funzione in C#

+3

Dict <(* func), oggetto [] params> sembra una cattiva idea ma sono solo io. –

+0

Lo uso per "cambiare" sui tipi, usando il Tipo come chiave e la funzione come codice. Funziona alla grande dove "switch (typeof (string))" non ... –

risposta

30

.NET utilizza delegati anziché puntatori di funzione. È possibile memorizzare un'istanza delegata come qualsiasi altro tipo di oggetto, in un dizionario o in altro modo.

Vedere Delegates dalla Guida di programmazione C# su MSDN.

8

Consultare la documentazione C# sui delegati, che è l'equivalente C# di un puntatore a funzione (potrebbe essere un puntatore a funzione semplice o essere una volta curried per fornire questo parametro). Ci sono molte informazioni che ti saranno utili.

+2

Quale documentazione C# sui delegati? I collegamenti sarebbero utili. – sblom

2

Ci sono un paio di modi per farlo. Potresti farlo come altri hanno suggerito attraverso l'uso dei delegati. Ma per far funzionare il dizionario, tutti avrebbero bisogno della stessa firma.

var funcs = new Dictionary<Action<object[]>, object[]>(); 

O se hanno firme diverse è possibile utilizzare il metodo effettivo riflessa, come il seguente

var funcs = new Dictionary<MethodInfo, object[]>(); 
22

si può assolutamente avere un dizionario di funzioni:

Dictionary<string, Action<T>> actionList = new Dictionary<string, Action<T>>(); 
Dictionary<string, Func<string>> functionList = new Dictionary<string, Func<string>>(); 

actionList.Add("firstFunction",()=>{/*do something;*/}); 
functionList.Add("firstFunction",()=>{return "it's a string!";}); 

È quindi possibile chiamare i metodi come questo:

string s = functionList["firstFunction"].Invoke(); 
+8

Puoi anche chiamarli direttamente: 'functionList [" firstFunction "]()' –

2

Utilizzare ether un delegato o un evento (a seconda dell'utilizzo).

+0

Come puoi memorizzare un evento in una collezione? – svick

+0

@svick, le proprietà degli eventi sono state richiamate e impostate, sono state aggiunte e rimosse, perché gli eventi mantengono un elenco di gestori. –

-1

Se si memorizzano solo i gestori di eventi allora ...

Dictionary<string, EventHandler> dictEvents = new Dictionary<string, EventHandler>(); 
dictEvents.Add("Event1", someEventHandler); 

... 

protected void someEventHandler(object sender, EventArgs e) 
{ 
    //Do something. 
} 

Edit:

  • ho messo questo qui perché ero alla ricerca di un modo per fare qualcosa di simile quando ho trovato questo post . Tuttavia, le soluzioni in questo post non hanno funzionato abbastanza per la mia situazione, quindi ho pensato di condividere ciò che ha funzionato per me.
+0

Cosa ti fa pensare che la domanda riguardi i gestori di eventi? – svick

Problemi correlati