[C#] 이벤트 생성 및 사용자 정의 EventArg

|

이벤트를 사용자가 생성하고 구독하는 방법에 대해서 살펴보겠습니다.

이벤트를 받을때 파라미터로 데이터를 받으려면 EventArg클래스를 상속받아서 원하는 항목을 추가해서

사용이 가능합니다.


아래는 이벤트를 발생시키는 클래스와 EventArg를 재정의한 클래스, 그리고 그 이벤트를 사용하는 예제입니다.



1.EventArg

/// Event Arguments Class
/// </summary>
public class HongsEventArgs : EventArgs
{
    public string Message { get; set; }
    public string SimpleData { get; set; }
    public List<Object> Data { get; set; }
}

위의 HongsEventArgs는 EventArgs를 상속받아서 3가지의 멤버변수를 추가했습니다.

여기에서 위의 2개는 단순 데이터 전달을 위해서 추가했구요, 마지막은 어디서나 사용가능하게

object를 리스트로 선언해서 어떠한 데이터라도 받을 수 있게 처리하였습니다.



2.이벤트 발생클래스

class SomethingEvent
{
    public event EventHandler eventSomthingClicked;

    public void RaseEvent()
    {
        try
        {
            if (eventSomthingClicked != null)
            {
                HongsEventArgs nowEventArg = new HongsEventArgs();
                nowEventArg.Message = "이벤트 클릭";
                nowEventArg.SimpleData = "NewSimpleData";
                nowEventArg.Data = new List<object>();
                nowEventArg.Data.Add(32);
                nowEventArg.Data.Add("HongJinHyeon");
                nowEventArg.Data.Add(new List<string>());
                eventSomthingClicked(null, nowEventArg); 
            }
        }
        catch (Exception)
        {
            
            throw;
        }
    }

}

위에서는 이벤트를 event EventHandler 로 선언해주고, 이벤트를 발생하는 부분에서 HongsEventArgs를 인스턴스화 해서 값 들을

할당을 해줍니다. 그리고  eventSomthingClicked(null,nowEventArg)로 이벤트를 발생시켜줍니다.

여기서 if로 eventSomthingClicked가 null 인지 체크하는 부분이 있는데요. 이 체크를 안하고 그냥 이벤트를 발생시켜버리면 오류

발생합니다. 이유는 이 이벤트를 실행하는 것이 델리게이트를 실행하는것과 비슷한데요 그 대상 함수가 없으니 오류가 발생하는 것입니다. 



3.이벤트 구독

private void Form1_Load(object sender, EventArgs e)
{
    try
    {
        SomethingEvent EventCreator = new SomethingEvent();
        EventCreator.eventSomthingClicked += EventCreator_eventSomthingClicked;
        EventCreator.RaseEvent();
    }
    catch (Exception)
    {
        
        throw;
    }
}

void EventCreator_eventSomthingClicked(object sender, EventArgs e)
{
    try
    {
        HongsEventArgs RecievedEventArg = e as HongsEventArgs;

        Console.WriteLine(RecievedEventArg.SimpleData);
    }

    catch (Exception)
    {
        
        throw;
    }
}

사용은 위에서처럼 이벤트를 구독한 후에, 이벤트를 구독하는 메서드에서 EventArgs를 as로 형변환을 해주고 사용해주면 됩니다.



And