가 프로그램으로 나가 어디에 사용하는 반사 클래스를 로드하도록에 따라 동적으로 텍스트 파일입니다.
실행할 때 코드 얻을 수 있는 모든 클래스,방법,그리고 이벤트를 인쇄하여 화면할 수 있도를 호출하는 방법입니다.
추가 모든 이벤트는 사전에 내가 원하는 열거를 통해 그들과 다를 만들의 이벤트 처리기를 얻는 데이터 전송에 의해 이벤트입니다.
여기에 내가 방법을 얻기 위해 이벤트를전
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));
}
이 로직에서 작동하는 모든 다른 프로그램을 때를 제외하고 내가 하려고 반사 클래스를 만들기 위해합니다.