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#
risposta
.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.
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.
Quale documentazione C# sui delegati? I collegamenti sarebbero utili. – sblom
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[]>();
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();
Puoi anche chiamarli direttamente: 'functionList [" firstFunction "]()' –
Utilizzare ether un delegato o un evento (a seconda dell'utilizzo).
Come puoi memorizzare un evento in una collezione? – svick
@svick, le proprietà degli eventi sono state richiamate e impostate, sono state aggiunte e rimosse, perché gli eventi mantengono un elenco di gestori. –
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.
Cosa ti fa pensare che la domanda riguardi i gestori di eventi? – svick
- 1. Come posso memorizzare un puntatore a funzione in una struttura?
- 2. Sintassi per un puntatore a una funzione che restituisce un puntatore a funzione in C
- 3. Come passare un puntatore a una funzione c in Cython?
- 4. Scrivi puntatore a funzione in C
- 5. Chiama C++ puntatore a funzione da C#
- 6. Come fanno dichiarare un puntatore a funzione extern "C"
- 7. sintassi puntatore funzione C
- 8. Come scrivere un puntatore a una funzione che restituisce un puntatore a una funzione?
- 9. Puntatore funzione C#?
- 10. Memorizzazione puntatore a funzione in std :: funzione
- 11. C: Puntatore inline funzione
- 12. Creare un puntatore a funzione che accetta un puntatore a funzione come argomento
- 13. C++ puntatore a funzione non è cambiato
- 14. In C, è mai sicuro lanciare un puntatore a funzione variadica su un puntatore a funzione con argomenti finiti?
- 15. C++ puntatore a funzione, Beginner Domanda
- 16. C++ callback modello con puntatore a funzione
- 17. Puntatore a un puntatore nell'obiettivo-c?
- 18. Funzione puntatore a funzione membro
- 19. Perché non è possibile memorizzare un puntatore a funzione di una classe base?
- 20. Come si dichiara una funzione che restituisce un puntatore a una funzione che restituisce un puntatore a funzione senza utilizzare un typedef in C?
- 21. I compilatori C++ possono inline un puntatore a funzione?
- 22. Casting un puntatore a funzione in una noexcept specificato puntatore a funzione
- 23. Puntatore funzione C++ (membro classe) a funzione membro non statico
- 24. Come definire correttamente un puntatore a funzione in struct, che prende struct come un puntatore?
- 25. Come memorizzare un riferimento a un numero intero in C#?
- 26. assegnazione del puntatore a funzione e chiamata in C++?
- 27. Può esserci un puntatore a un puntatore a un puntatore?
- 28. Puntatore di funzione C++ come membro statico
- 29. Dichiarazione ricorsiva del puntatore funzione in C
- 30. Puntatore funzione come argomento
Dict <(* func), oggetto [] params> sembra una cattiva idea ma sono solo io. –
Lo uso per "cambiare" sui tipi, usando il Tipo come chiave e la funzione come codice. Funziona alla grande dove "switch (typeof (string))" non ... –