Tengo un programa en el que yo estoy usando la Reflexión para cargar las clases de forma dinámica basándose en un archivo de texto.
Cuando ejecuto mi código me puede conseguir todas las clases, métodos y Eventos de la impresión de la pantalla, e incluso puede Invocar los métodos.
He añadido todos los eventos en un Diccionario y quiero enumerar a través de ellos y, a continuación, crear un Controlador de Eventos para obtener los datos enviados por el evento.
este es mi método para obtener los eventos de un diccionario:
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;
}
si puedo imprimir el Diccionario puedo ver los eventos por una Clave y un Valor.
pero no me parece para crear un controlador de Eventos. He intentado muchas opciones, incluyendo:
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");
}
}
estoy tratando de subscibe para el evento y manejar los datos en otra clase denominada "DisplayChangeEvents".
he estado tratando durante 2 días para llegar a esto y a su la última pieza que necesita para obtener el programa funciona como se esperaba.
Gracias de antemano
basado en una sugerencia que he actualizado el código del bucle foreach para :
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));
//}
}
obtener la siguiente excepción:
La conversión especificada no es válida.
la clase que es la creación de los eventos que se parece a esto:
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;
}
}
el evento que dispara el evento se parece a esto:
if (i == 1)
{
_onPowerStateRecieved(null, new PowerStateEventsArgs(true));
}
esta lógica funciona en todos los demás programas, excepto cuando estoy tratando de reflexión para crear las clases de forma dinámica.