C# Usando la Reflexión para suscribirse a Eventos

0

Pregunta

Tengo un programa en el que yo estoy usando la Reflexión para cargar las clases de forma dinámica basándose en un archivo de texto.

Cuando ejecuto mi código me puede conseguir todas las clases, métodos y Eventos de la impresión de la pantalla, e incluso puede Invocar los métodos.

He añadido todos los eventos en un Diccionario y quiero enumerar a través de ellos y, a continuación, crear un Controlador de Eventos para obtener los datos enviados por el evento.

este es mi método para obtener los eventos de un diccionario:

 private Dictionary<string, EventInfo> RetrieveEvents(string label, string type)
    {
        try
        {
            this.displaysAssembly = Assembly.LoadFrom(Path.Combine(Directory.GetApplicationDirectory(), "Framework.DisplayDrivers.dll"));

            string assembly = string.Format("Framework.DisplayDrivers.{0}", type);
            Type cswitcher = displaysAssembly.GetType(assembly);

            fullClass = cswitcher;
            Dictionary<string, EventInfo> ekvp = new Dictionary<string, EventInfo>();
            List<EventInfo> eventInfos = cswitcher.GetEvents().Where(e => HasInformationAttribute(e)).ToList();

            foreach (var e in eventInfos)
            {                   
                if (!ekvp.ContainsKey(label))
                {
                    ekvp.Add(e.Name, e);
                }

            }

            return (ekvp);
        }
        catch (MissingMethodException e)
        {
            ErrorLog.Error(LogHeader + "Unable to create Display. No constructor: {0}", e.Message);
        }
        catch (ArgumentException e)
        {
            ErrorLog.Error(LogHeader + "Unable to create Display. No type: {0}", e.Message);
        }
        catch (NullReferenceException e)
        {
            ErrorLog.Error(LogHeader + "Unable to create Display. No match: {0}", e.Message);
        }


        return null;
    }

si puedo imprimir el Diccionario puedo ver los eventos por una Clave y un Valor.

pero no me parece para crear un controlador de Eventos. He intentado muchas opciones, incluyendo:

foreach(var evnt in d._projectors._events)
                 {
                     EventInfo ev = evnt.Value;


                     try
                     {

                         // this id not work
                         object classInstance = Activator.CreateInstance(d._projectors.fullClass);
                         ev.AddEventHandler(classInstance, new EventHandler(DisplayChangeEvents.DisplayMuteChangedEvent));

                         // this did not work either

                         if (d._projectors._events.TryGetValue("OnPowerStateRecieved", out ev))
                         {
                             ev.AddEventHandler(ev.Name, new EventHandler(DisplayChangeEvents.DisplayPowerChangedEvent));                               
                         }

                     }
                     catch (Exception ex)
                     {

                         ErrorLog.Error("Error creating event handers :  " +  ex.Message + "\r");
                     }                      



                 }

estoy tratando de subscibe para el evento y manejar los datos en otra clase denominada "DisplayChangeEvents".

he estado tratando durante 2 días para llegar a esto y a su la última pieza que necesita para obtener el programa funciona como se esperaba.

Gracias de antemano

basado en una sugerencia que he actualizado el código del bucle foreach para :

 foreach(var evnt in d._projectors._events)
                {
                    EventInfo ev = evnt.Value;


                    try
                    {

                        if (evnt.Key == "OnPowerStateRecieved")
                        {
                            ev.AddEventHandler(d._projectors.fullClass, new EventHandler(DisplayChangeEvents.DisplayPowerChangedEvent));
                        }
                        else if (evnt.Key == "OnMuteStateRecieved")
                        {
                            ev.AddEventHandler(d._projectors.fullClass, new EventHandler(DisplayChangeEvents.DisplayMuteChangedEvent));
                        }
                        // this id not work
                        // object classInstance = Activator.CreateInstance(d._projectors.fullClass);
                        //  ev.AddEventHandler(classInstance, new EventHandler(DisplayChangeEvents.DisplayMuteChangedEvent));

                        //ev.AddEventHandler(d._projectors.fullClass, new EventHandler(DisplayChangeEvents.DisplayMuteChangedEvent));

                        //// this did not work either

                        //if (d._projectors._events.TryGetValue("OnPowerStateRecieved", out ev))
                        //{
                        //    ev.AddEventHandler(ev.Name, new EventHandler(DisplayChangeEvents.DisplayPowerChangedEvent));                               
                        //}

                    }

obtener la siguiente excepción:

La conversión especificada no es válida.

la clase que es la creación de los eventos que se parece a esto:

 private static event EventHandler<PowerStateEventsArgs> _onPowerStateRecieved = delegate { };
    [Information(Description = "Power Event")]

    public static event EventHandler<PowerStateEventsArgs> OnPowerStateRecieved
    {
        add
        {
            if (!_onPowerStateRecieved.GetInvocationList().Contains(value))
            {
                 _onPowerStateRecieved += value;
            }
        }
        remove
        {
            _onPowerStateRecieved -= value;
        }
    }

el evento que dispara el evento se parece a esto:

 if (i == 1)
                {
                    _onPowerStateRecieved(null, new PowerStateEventsArgs(true));
                }

esta lógica funciona en todos los demás programas, excepto cuando estoy tratando de reflexión para crear las clases de forma dinámica.

c# event-handling events reflection
2021-11-19 17:49:46
1

Mejor respuesta

0

Tomé el consejo de la gente de aquí y volver a cortar mi código y se fue de vuelta a lo básico con los controladores de eventos. Yo era capaz de cargar los controladores en mi código a través de la reflexión y la invocación de los miembros, sin Embargo era incapaz de obtener los eventos funcionan de la forma que yo pensaba. Yo era capaz de añadir un interruptor de caso y ver que los controladores se cargan y suscribirse a los eventos manualmente. No es ideal, pero si este grupo no me había dicho nada a recortar y volver a lo básico yo nunca habría llegado tan lejos como lo hice yo. Gracias a todos

2021-12-08 17:52:33

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................