¿Cómo creo un diccionario donde puedo almacenar funciones?
Gracias.
Tengo más de 30 funciones que se pueden ejecutar desde el usuario. Quiero poder ejecutar la función de esta manera:
private void functionName(arg1, arg2, arg3)
{
// code
}
dictionaryName.add("doSomething", functionName);
private void interceptCommand(string command)
{
foreach ( var cmd in dictionaryName )
{
if ( cmd.Key.Equals(command) )
{
cmd.Value.Invoke();
}
}
}
Sin embargo, la firma de la función no es siempre la misma, por lo que tiene una cantidad diferente de argumentos.
Respuestas:
Me gusta esto:
Esto le permite almacenar funciones que toman un parámetro de cadena y devuelven booleanos.
O si la función no es anónima:
donde Foo se define así:
ACTUALIZAR:
Después de ver su actualización, parece que no conoce de antemano la firma de la función que le gustaría invocar. En .NET para invocar una función es necesario pasar todos los argumentos y si no sabe cuáles serán los argumentos, la única forma de lograrlo es mediante la reflexión.
Y aquí hay otra alternativa:
Con este enfoque, aún necesita saber el número y el tipo de parámetros que deben pasarse a cada función en el índice correspondiente del diccionario o obtendrá un error de tiempo de ejecución. Y si sus funciones no tienen valores de retorno, use en
System.Action<>
lugar deSystem.Func<>
.fuente
Dictionary<int, Delegate>
.Comencemos con algunas funciones definidas así:
Realmente tienes 2 opciones viables a tu disposición:
1) Mantenga la seguridad de tipos haciendo que los clientes llamen directamente a su función.
Esta es probablemente la mejor solución, a menos que tenga muy buenas razones para romper con este modelo.
Cuando hablas de querer interceptar llamadas a funciones, me parece que estás tratando de reinventar funciones virtuales. Hay un montón de formas de sacar este tipo de funcionalidad de la caja, como heredar de una clase base y anular sus funciones.
Me parece que quieres una clase que sea más un contenedor que una instancia derivada de una clase base, así que haz algo como esto:
2) O asigne la entrada de sus funciones a una interfaz común.
Esto podría funcionar si todas sus funciones están relacionadas. Por ejemplo, si está escribiendo un juego y todas las funciones afectan a alguna parte del jugador o del inventario del jugador. Terminarías con algo como esto:
fuente
object
similar a la que se pasaría a un nuevo hilo.Oye, espero que esto te ayude. ¿De qué idioma vienes?
fuente
¿Por qué no usar
params object[] list
para los parámetros del método y hacer alguna validación dentro de sus métodos (o lógica de llamada)? Permitirá un número variable de parámetros.fuente
El siguiente escenario le permitiría usar un diccionario de elementos para enviar como parámetros de entrada y obtener lo mismo que los parámetros de salida.
Primero agregue la siguiente línea en la parte superior:
Luego, dentro de su clase, defina el diccionario de la siguiente manera:
Esto le permitiría ejecutar estas funciones anónimas con una sintaxis similar a esta:
fuente
Defina el diccionario y agregue la referencia de la función como valor, usando
System.Action
como tipo:Luego invocalo con:
fuente