unity saber pro pago online license games faq cuesta cuanto como c# events

c# - saber - ¿Cómo obtengo los suscriptores de un evento?



unity pago (4)

Actualización (gracias a los comentaristas): la inmunidad del delegado significa que la clonación no logra nada con una asignación.

Cuando uno escribe:

myDelegate += AHandler

Se crea una instancia de delegado completamente nueva y se asigna a myDelegate.

Por lo tanto, el siguiente código funcionaría exactamente igual sin la llamada de clonación.

MulticastDelegate (el tipo subyacente) tiene un método Clone.

Para poder llegar al delegado subyacente, es posible que deba evitar el helper habitual que genera la palabra clave del evento y administrar las cosas directamente (agregar y eliminar accesadores personalizados).

Para mostrar esto:

class Program { public delegate void MyDelegate(string name); public event MyDelegate EventOne; public void HandlerOne(string name) { Console.WriteLine("This is handler one: {0}", name); } public void HandlerTwo(string name) { Console.WriteLine("This is handler two: {0}", name); } public void HandlerThree(string name) { Console.WriteLine("This is handler three: {0}", name); } public void Run() { EventOne += HandlerOne; EventOne += HandlerTwo; Console.WriteLine("Before clone"); EventOne("EventOne"); MyDelegate eventTwo = (MyDelegate)EventOne.Clone(); MyDelegate eventTwo = EventOne; Console.WriteLine("After clonecopy"); EventOne("EventOne"); eventTwo("eventTwo"); Console.WriteLine("Change event one to show it is different"); EventOne += HandlerThree; EventOne("EventOne"); eventTwo("eventTwo"); } static void Main(string[] args) { (new Program()).Run(); } }

Necesito copiar los suscriptores de un evento a otro evento. ¿Puedo obtener los suscriptores de un evento (como MyEvent [0] devolver un delegado)?

Si esto no es posible, usaría el acceso adicional para agregar los delegados a una lista. ¿Esa sería la mejor solución?


En caso de que necesite examinar a los suscriptores de un evento de clase externo:

EventHandler e = typeof(ExternalClass) .GetField(nameof(ExternalClass.Event), BindingFlags.Instance | BindingFlags.NonPublic) .GetValue(instanceOfExternalClass) as EventHandler; if (e != null) { Delegate[] subscribers = e.GetInvocationList(); }


Los eventos / delegados C # son multidifusión, por lo que el delegado es una lista en sí mismo . Desde dentro de la clase, para obtener llamadas individuales, puede usar:

if(field != null) { // or the event-name for field-like events // or your own event-type in place of EventHandler foreach(EventHandler subscriber in field.GetInvocationList()) { // etc } }

Sin embargo, para asignar todo de una vez, simplemente use + = o asignación directa:

SomeType other = ... other.SomeEvent += localEvent;


Si el evento es uno publicado por otra clase, no puede, al menos, no confiablemente. Si bien a menudo pensamos que un evento es simplemente una variable de delegado, en realidad se trata de un par de métodos: agregar y eliminar (o suscribirse y cancelar suscripción).

Si es su propio código el que publica el evento, es fácil: puede hacer que los usuarios accedan o eliminen lo que quieran.

Eche un vistazo a mi artículo sobre eventos y vea si eso lo ayuda. De lo contrario, brinde más detalles sobre lo que quiere hacer, especificando qué bits de código puede modificar y cuáles no.