2010-03-31 20 views
18

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#

+3

Dict <(* func), objeto params []> se ve como una mala idea, pero eso es sólo conmigo. –

+0

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 ... –

Respuesta

30

.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.

8

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.

+2

¿Qué documentación de C# sobre los delegados? Los enlaces serían útiles. – sblom

2

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[]>(); 
22

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(); 
+8

También puede llamarlos directamente: 'functionList [" firstFunction "]()' –

2

Use ether un delegado o un evento (dependiendo del uso).

+0

¿Cómo se puede almacenar un evento en una colección? – svick

+0

@svick, las propiedades de eventos downy tienen get y set, tienen add and remove, porque los eventos mantienen una lista de manejadores. –

-1

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í.
+0

¿Qué te hace pensar que la pregunta es sobre los controladores de eventos? – svick

Cuestiones relacionadas