मैं एक कार्यक्रम है, जहां मैं का उपयोग कर रहा हूँ प्रतिबिंब लोड करने के लिए वर्गों के आधार पर डायनामिक रूप से एक पाठ फ़ाइल है ।
जब मैं चलाने के लिए अपने कोड मैं प्राप्त कर सकते हैं सभी कक्षाएं, तरीकों और घटनाओं मुद्रण स्क्रीन करने के लिए और कर सकते हैं भी आह्वान तरीकों में है.
मैं जोड़ा गया करने के लिए सभी घटनाओं के लिए एक शब्दकोश और मैं चाहते हैं की गणना करने के लिए उन के माध्यम से और फिर बनाने के लिए एक घटना हैंडलर प्राप्त करने के द्वारा भेजे गए डेटा घटना है ।
यहाँ है मेरे विधि के लिए हो रही घटनाओं के लिए एक शब्दकोश:
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));
}
इस तर्क में काम करता है अन्य सभी कार्यक्रमों को छोड़कर जब मैं कोशिश कर रहा हूँ प्रतिबिंब करने के लिए बनाने के लिए वर्गों गतिशील रूप से ।