Cómo almacenar un puntero a función en C#

Digamos que yo quiero para almacenar un grupo de punteros a función en un List<(*func)> y, a continuación, llame más tarde, quizá incluso con los parámetros… Como si me almacenados en un Dict<(*func), object[] params> podría llamar a la func con los parámetros? ¿Cómo puedo hacer esto?

  • Dict<(*func), object[] params> parece una mala idea, pero eso es sólo conmigo.
  • Yo lo uso para «cambiar» en tipos, utilizando el Tipo de la clave y la función del código. Funciona muy bien donde «interruptor(typeof(cadena))» no…
InformationsquelleAutor y2k | 2010-03-31

6 Kommentare

  1. 34

    .NET utiliza delegados en lugar de punteros a función. Puede almacenar una instancia de delegado como cualquier otro tipo de objeto, en un diccionario o de otra manera.

    Ver Los delegados de la Programación de C# Guía en MSDN.

  2. 22

    Es absolutamente posible tener 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!";});

    Puede llamar a los métodos como este:

    string s = functionList["firstFunction"].Invoke();
    • También puede llamar directamente: functionList["firstFunction"]()
  3. 8

    Vistazo a la documentación de C# a los delegados, que es el equivalente en C# de un puntero a función (puede ser un simple puntero a función o estar al curry, una vez que el suministro de este parámetro). Hay una gran cantidad de información que será útil para usted.

    • Que C# documentación de los delegados? Los enlaces, sería útil.
  4. 2

    Hay un par de maneras que usted podría hacer esto. Usted podría hacerlo como otros han sugerido, a través de la utilización de los delegados. Pero para obtener el diccionario para trabajar, todos necesitan la misma firma.

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

    O si tienen diferentes firmas usted podría utilizar la real refleja método, como el siguiente

    var funcs = new Dictionary<MethodInfo, object[]>();
  5. 2

    Uso de éter de un delegado o un evento (dependiendo del uso).

    • ¿Cómo se puede almacenar un evento en una colección?
    • Propiedades de evento downy han get y set, se han de añadir y quitar, porque los acontecimientos de mantener una lista de los controladores.
  6. -1

    Si sólo almacenar los controladores de eventos, a continuación,…

    Dictionary<string, EventHandler> dictEvents = new Dictionary<string, EventHandler>();
    dictEvents.Add("Event1", someEventHandler);
    
    ...
    
    protected void someEventHandler(object sender, EventArgs e)
    {
       //Do something.
    }

    Edición:

    • Pongo esto aquí porque yo estaba buscando una forma de hacer algo similar cuando me encontré con este post. Sin embargo, las soluciones que en este post no acababa de funcionar para mi situación, así que pensé que me gustaría compartir lo que funcionó para mí.
    • ¿Qué te hace pensar que la pregunta es acerca de los controladores de eventos?

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea