सी# प्रतिबिंब का उपयोग करने के लिए घटनाओं के लिए सदस्यता लें

0

सवाल

मैं एक कार्यक्रम है, जहां मैं का उपयोग कर रहा हूँ प्रतिबिंब लोड करने के लिए वर्गों के आधार पर डायनामिक रूप से एक पाठ फ़ाइल है ।

जब मैं चलाने के लिए अपने कोड मैं प्राप्त कर सकते हैं सभी कक्षाएं, तरीकों और घटनाओं मुद्रण स्क्रीन करने के लिए और कर सकते हैं भी आह्वान तरीकों में है.

मैं जोड़ा गया करने के लिए सभी घटनाओं के लिए एक शब्दकोश और मैं चाहते हैं की गणना करने के लिए उन के माध्यम से और फिर बनाने के लिए एक घटना हैंडलर प्राप्त करने के द्वारा भेजे गए डेटा घटना है ।

यहाँ है मेरे विधि के लिए हो रही घटनाओं के लिए एक शब्दकोश:

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

अगर मैं बाहर प्रिंट शब्दकोश में मैं देख सकते हैं घटनाओं के द्वारा कुंजी और मान है ।

लेकिन मैं प्रतीत नहीं कर सकते करने के लिए कोई ईवेंट हैंडलर बनाने. मैंने कोशिश की है कई विकल्प सहित:

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



                 }

मैं कोशिश कर रहा हूँ करने के लिए subscibe घटना के लिए और डेटा को संभालने में एक और क्लास नाम "DisplayChangeEvents".

मैं कोशिश कर रहा है 2 दिनों के लिए इस पाने के लिए और अपने पिछले टुकड़ा मैं पाने के लिए की जरूरत कार्यक्रम के रूप में काम करने की उम्मीद है.

धन्यवाद अग्रिम में

के आधार पर एक सुझाव है, मैं अद्यतन कोड में foreach पाश करने के लिए :

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

                    }

निम्न अपवाद:

निर्दिष्ट कलाकार मान्य नहीं है ।

वर्ग पैदा कर रही है कि घटनाओं के इस तरह दिखता है:

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

घटना में है कि आग की घटना इस तरह दिखता है:

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

इस तर्क में काम करता है अन्य सभी कार्यक्रमों को छोड़कर जब मैं कोशिश कर रहा हूँ प्रतिबिंब करने के लिए बनाने के लिए वर्गों गतिशील रूप से ।

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

सबसे अच्छा जवाब

0

मैं सलाह ली लोगों के यहाँ और कटौती वापस अपने कोड और चला गया वापस मूल बातें करने के लिए के साथ इवेंट handlers. मैं लोड करने में सक्षम था के ड्राइवरों में से मेरे कोड के माध्यम से प्रतिबिंब और आह्वान के सदस्यों, हालांकि मैं था प्राप्त करने में असमर्थ घटनाओं में काम कर रहा है कि जिस तरह से मैंने सोचा था कि वे होगा. मैं करने में सक्षम था बस में जोड़ने के लिए एक स्विच मामले और देखने के लिए जो ड्राइवरों लोड किया गया है और सदस्यता ली घटनाओं के लिए मैन्युअल रूप से । आदर्श नहीं है लेकिन, अगर इस समूह में नहीं बताया था मुझे वापस कटौती करने के लिए और वापस जाने के लिए मूल बातें मैं कभी नहीं मिल गया है के रूप में दूर के रूप में मैं था. आप सभी को धन्यवाद

2021-12-08 17:52:33

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

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

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में