Digamos que yo quiero para almacenar un grupo de punteros a funciones en un List<(*func)>
, y luego llamar a ellos, tal vez incluso con parámetros ... Como si almacena en un Dict<(*func), object[] params>
podría llamar a la Func con los parámetros? ¿Cómo haría esto?Cómo almacenar un puntero de función en C#
Respuesta
.NET utiliza delegados en lugar de punteros a las funciones. Puede almacenar una instancia de delegado como cualquier otro tipo de objeto, en un diccionario o de otro modo.
Ver Delegates de la C# Guía de programación en MSDN.
Look en el C# documentación sobre los delegados, que es el equivalente C# de un puntero de función (que puede ser un puntero de función normal o ser al curry una vez para suministrar el este parámetro). Hay mucha información que te será útil.
¿Qué documentación de C# sobre los delegados? Los enlaces serían útiles. – sblom
Hay varias formas de hacerlo. Podrías hacerlo como otros han sugerido mediante el uso de delegados. Pero para que el diccionario funcione, todos necesitarían la misma firma.
var funcs = new Dictionary<Action<object[]>, object[]>();
O si tienen diferentes firmas que podría utilizar el método reflejado real, como la siguiente
var funcs = new Dictionary<MethodInfo, object[]>();
Puede absolutamente tiene un diccionario de funciones:
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!";});
A continuación, puede llamar a los métodos como éste:
string s = functionList["firstFunction"].Invoke();
También puede llamarlos directamente: 'functionList [" firstFunction "]()' –
Use ether un delegado o un evento (dependiendo del uso).
¿Cómo se puede almacenar un evento en una colección? – svick
@svick, las propiedades de eventos downy tienen get y set, tienen add and remove, porque los eventos mantienen una lista de manejadores. –
Si sólo está almacenando controladores de eventos luego ...
Dictionary<string, EventHandler> dictEvents = new Dictionary<string, EventHandler>();
dictEvents.Add("Event1", someEventHandler);
...
protected void someEventHandler(object sender, EventArgs e)
{
//Do something.
}
Editar:
- Pongo esto aquí porque yo estaba buscando una manera de hacer algo similar cuando me encontré con este post . Sin embargo, las soluciones en esta publicación no funcionaron para mi situación, así que pensé que compartiría lo que funcionó para mí.
¿Qué te hace pensar que la pregunta es sobre los controladores de eventos? – svick
- 1. ¿Cómo puedo almacenar un puntero de función en una estructura?
- 2. Puntero de función C#?
- 3. C# función de puntero en función sobrecargada
- 4. Sintaxis para un puntero a una función que devuelve un puntero de función en C
- 5. C++ almacenar un puntero a una función miembro de la clase desconocida
- 6. Llamar C++ puntero de función de C#
- 7. ¿Cómo paso un puntero a una función c en Cython?
- 8. ¿Cómo declarar un puntero de función extern "C"
- 9. Puntero de función para __tribuir __ ((const)) función?
- 10. Inicializando un puntero en una función separada en C
- 11. ¿Cómo declaras un puntero a una función que devuelve un puntero a una matriz de valores int en C/C++?
- 12. C: ¿Cómo pasar un doble puntero a una función
- 13. C: puntero a función en línea
- 14. ¿Cómo se puede implementar un puntero excepto almacenar una dirección?
- 15. Cómo declarar un puntero de función __stdcall
- 16. C puntero de función de conversión para anular puntero
- 17. Puntero de retorno de la función C
- 18. En C, ¿es seguro lanzar un puntero de función variable a un puntero de función con argumentos finitos?
- 19. Puntero a un puntero en objetivo-c?
- 20. Puntero de función C++ como miembro estático
- 21. ¿Por qué no es posible almacenar un puntero de función de una clase base?
- 22. Almacenar la dirección de un puntero en un int sin signo en C
- 23. shared_ptr múltiple almacenar mismo puntero
- 24. puntero de la función Typedef?
- 25. función de pase como puntero de función
- 26. Cómo obtener el nombre de función de un puntero de función C
- 27. Puntero de función C++ como parámetro
- 28. Cómo definir un puntero de función de miembro general
- 29. Puntero de función que apunta a una función que toma un puntero de función
- 30. C++ borrar un puntero a un puntero
Dict <(* func), objeto params []> se ve como una mala idea, pero eso es sólo conmigo. –
Lo uso para "activar" tipos, usando el tipo como la clave y la función como el código. Funciona muy bien donde "switch (typeof (string))" no ... –