Obtener todas las instancias de Target para un delegado
Frecuentes
Visto 2,731 veces
2
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
2 Respuestas
4
Delegate[] list = delegate.GetInvocationList();
Eso te dará una variedad de Delegate
objetos, que puede utilizar para obtener la lista de Target
s.
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
0
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 c# delegates or haz tu propia pregunta.
Muestre un código mínimo, y explique de qué manera "no funciona". - Sergey Kalinichenko
¿Estás convirtiendo todo esto en una instancia de delegado? - Botonomous
He actualizado la pregunta - Saeid Yazdani
@Anon ¡Sí, creo que lo estoy haciendo de esa manera! - Saeid Yazdani
¿Por qué esperarías que el elenco
string[]
¿trabajar? ¿Por qué estás usandostring
?writer.Target
isnull
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. - svick