C#리플렉션을 사용하여 이벤트를 구독

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

나는 통보의 사람들이 여기하고 다시 잘라 내 코드와 다시 갔을 기초와 이벤트 처리기입니다. 할 수 있었을 로드 드라이버에 코드를 통해 반영하고 호출 구성원은,그러나 나를 얻을 수 없었던 이벤트는 방식으로 작동하는 내 생각에 그들은 것입니다. 할 수 있었을 추가로서 스위치-케이스 및 보 드라이버드와 구독 이벤트에 수동으로 합니다. 이상적이지 않지만 이 경우 그룹을 말하지 않을 잘라 다시 기본으로 돌아 가고 싶지 않을 받고 있는 만큼 했습니다. 감사

2021-12-08 17:52:33

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................