C # Olaylara abone olmak için Yansıma Kullanma

0

Soru

Sınıfları bir metin dosyasına göre dinamik olarak yüklemek için Yansıma kullandığım bir programım var.

Kodumu çalıştırdığımda, tüm sınıfları, yöntemleri ve Olayları ekrana yazdırabilir ve hatta yöntemleri çağırabilirim.

Tüm olayları bir Sözlüğe ekledim ve bunları numaralandırmak ve ardından olay tarafından gönderilen verileri almak için bir Olay İşleyicisi oluşturmak istiyorum.

işte olayları bir sözlüğe almak için benim yöntemim:

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

sözlüğü yazdırırsam olayları Anahtar ve Değere göre görebilirim.

ancak bir Olay işleyicisi oluşturamıyorum. Aşağıdakiler de dahil olmak üzere birçok seçenek denedim:

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



                 }

olaya subscibe etmeye ve verileri "DisplayChangeEvents" adlı başka bir sınıfta işlemeye çalışıyorum.

bunu elde etmek için 2 gündür uğraşıyorum ve programın beklendiği gibi çalışmasını sağlamak için ihtiyacım olan son parça.

Şimdiden teşekkür ederiz

bir öneriye dayanarak, foreach döngüsündeki kodu şu şekilde güncelledim :

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

                    }

aşağıdaki özel durumu alın:

Belirtilen döküm geçerli değil.

olayları oluşturan sınıf şöyle görünür:

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

olayı tetikleyen olay şöyle görünür:

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

bu mantık, sınıfları dinamik olarak oluşturmak için yansıtmaya çalıştığım durumlar dışında diğer tüm programlarda çalışır.

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

En iyi cevabı

0

Buradaki insanların tavsiyelerini dinledim ve kodumu kestim ve olay işleyicileri ile temellere geri döndüm. Sürücüleri kodumda yansıma yoluyla yükleyebildim ve üyeleri çağırabildim, Ancak olayları düşündüğüm şekilde çalıştıramadım. Sadece bir anahtar kutusu ekleyebildim ve hangi sürücülerin yüklendiğini ve olaylara manuel olarak abone olduğunu görebildim. İdeal değil, ama eğer bu grup bana geri çekilmemi ve temellere geri dönmemi söylememiş olsaydı, asla yaptığım kadar ileri gidemezdim. Hepinize teşekkür ederim

2021-12-08 17:52:33

Diğer dillerde

Bu sayfa diğer dillerde

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