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.