C# Utilizzando la Reflection per sottoscrivere gli Eventi

0

Domanda

Ho un programma in cui io sto usando la Reflection per classi di carico dinamico basato su un file di testo.

Quando ho eseguito il mio codice posso ottenere tutte le classi, i metodi e gli Eventi stampa schermo e può anche Richiamare i metodi.

Ho aggiunto tutti gli eventi di un Dizionario e voglio enumerare attraverso di loro e quindi creare un Gestore di Eventi per ottenere i dati inviati dall'evento.

ecco il mio metodo per ottenere le vicende di un dizionario:

 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;
    }

se io stampo il Dizionario riesco a vedere gli eventi Chiave e Valore.

ma mi sembra di non riuscire a creare un gestore di Eventi. Ho provato molte opzioni tra cui:

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");
                     }                      



                 }

sto cercando di subscibe all'evento e gestire i dati in un'altra classe di nome "DisplayChangeEvents".

ho cercato per 2 giorni per arrivare a questo e che è l'ultimo pezzo che ho bisogno di ottenere il programma di lavoro come previsto.

Grazie in anticipo

basato su un suggerimento che ho aggiornato il codice nel ciclo foreach per :

 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));                               
                        //}

                    }

ottenere la seguente eccezione:

Cast specificato non è valido.

la classe che è la creazione di eventi simile a questo:

 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;
        }
    }

l'evento che attiva l'evento assomiglia a questo:

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

questa logica funziona in tutti gli altri programmi, ad eccezione di quando sto cercando di riflessione per creare le classi in modo dinamico.

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

Migliore risposta

0

Ho preso il consiglio di gente qui e tagliare di nuovo il mio codice e tornato alle origini con i gestori di eventi. Sono stato in grado di caricare i driver nel mio codice via di riflessione e di richiamare i membri, Tuttavia sono stato in grado di ottenere gli eventi di lavoro, il modo in cui ho pensato che sarebbe. Sono stato in grado solo di aggiungere un interruttore di caso e vedere che i driver sono stati caricati e sottoscritto eventi manualmente. Non è l'ideale, ma se questo gruppo non aveva detto a me di tagliare indietro e tornare alle origini, non avrei mai ottenuto per quanto riguarda l'ho fatto. Grazie a tutti

2021-12-08 17:52:33

In altre lingue

Questa pagina è in altre lingue

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