Obtener todas las instancias de Target para un delegado

Si solo registro un método de una clase para un delegado, puedo usar el delegate.Target, pero cuando suscribo más métodos de diferentes clases, esto ya no funciona. ¿Hay otra forma de acceder a la lista de suscriptores de este delegado?

Aquí está el código: el bucle foreach se evalúa como nulo en tiempo de ejecución (se compila)

    public delegate void WriteMessage(string msg);

internal class Program
{
    private static void Main(string[] args)
    {
        var myClass = new MyClass();
        var writer = new WriteMessage(myClass.WriteMessage);

        writer += SaySomething; //method in this class
        writer += myClass.SayShit; //instance class
        writer += AnotherClass.Say; //static class

        foreach(string target in (string[])writer.Target)
        {
            Console.WriteLine(target);
        }

        Console.ReadLine();
    }

    private static void SaySomething(string msg)
    {
        Console.WriteLine("HI!!!!");
    }
}

código completo: http://pastebin.com/AzzRGMY9

preguntado el 12 de junio de 12 a las 22:06

Muestre un código mínimo, y explique de qué manera "no funciona". -

¿Estás convirtiendo todo esto en una instancia de delegado? -

He actualizado la pregunta -

@Anon ¡Sí, creo que lo estoy haciendo de esa manera! -

¿Por qué esperarías que el elenco string[] ¿trabajar? ¿Por qué estás usando string? writer.Target is null porque el último método es estático, por lo que no tiene objetivo. Si fuera otra cosa, tu elenco lanzaría una excepción. -

2 Respuestas

Delegate[] list = delegate.GetInvocationList();

Eso te dará una variedad de Delegate objetos, que puede utilizar para obtener la lista de Targets.

Respondido el 12 de junio de 12 a las 22:06

Esto funciona en parte, pero veo 2 líneas vacías al hacer Console.WriteLine(target.Target); en un bucle foreach list variedad - Saeid Yazdani

@Sean87 Target es la ejemplo en el que se llama al método. Si el método es estático, no hay instancia, por lo que Target is null. - svick

Bien, el primero y el tercero están vinculados a myClass, que se almacena en el Target, pero el segundo y el cuarto están vinculados a métodos estáticos, por lo que Target es nulo (lo que se traduce en una cadena vacía). - kendall frey

Gracias, @KendallFrey. Ese comentario resolvió un problema que estaba teniendo, no relacionado con el OP. :-)- gordofabuloso

Esta es solo información adicional de la respuesta aceptada, ya que estoy buscando la misma información en línea.

Si desea invocar todos los métodos registrados al recibir toda la lista de invocaciones, puede usar este código:

 Delegate[] listAllRegisteredMethods = writer.GetInvocationList(); //writer is the variable based on the question example

        foreach(Delegate c in listAllRegisteredMethods )
        {
            object[] p = { }; //Insert your parameters here inside the array if your delegate has parameters
            c.DynamicInvoke(p); //Invoke it, if you have return values, assign it on a different variable
        }

Respondido el 11 de Septiembre de 19 a las 19:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.