이벤트를 사용자가 생성하고 구독하는 방법에 대해서 살펴보겠습니다.
이벤트를 받을때 파라미터로 데이터를 받으려면 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로 형변환을 해주고 사용해주면 됩니다.
'프로그래밍 > C#' 카테고리의 다른 글
[C#] 리플렉션 ( Reflection ) (1) | 2015.03.24 |
---|---|
[C#] 사용자 정의 코드조각 추가하기 (Code Snippet) (1) | 2015.03.23 |
[C#] XML 다루기 - Property 와 Node 접근하기, 네임스페이가 있는 Node처리리 (0) | 2015.03.20 |
[C#] XML 다루기 - REST 데이터 받아서 처리하기 (0) | 2015.03.20 |
[C#] List Collection 재정의(Override) 하기 (2) | 2015.03.19 |