GetEvent
지금 원하는 건
플랫폼은 WPF이고
특정 메서드를 하나 만들고 거기에 파라미터로 FrameworkElement 하나를 넘기면
그 FrameworkElement가 가지고 있는 이벤트를 몽땅 가져오거나 (반환 타입은 Delegate나 EventHandler 정도)
혹은 현재 핸들러가 등록되어 있는 이벤트를 가져오는 동작입니다.
이것저것 찾아보니 일단 이벤트를 Reflection을 통해 가져오는 방법은 찾았는데요.
그래서 시험삼아 이벤트의 이름을 나열하는 메서드를 만들었습니다.
public static BindingFlags AllBindings
{
get
{
return BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance |
BindingFlags.Static| BindingFlags.GetField | BindingFlags.Default | BindingFlags.GetProperty | BindingFlags.SetField;
}
}
public static void GetAllEventHandlerNamesByReflection(object obj)
{
var nameList = new List<string>();
// 해당 객체의 Type 객체 가져온다.
var type = obj.GetType();
// 가져온 Type 객체로부터 Event 목록 가져온다. (타입은 EventInfo[])
var events = type.GetEvents();
foreach (var eventInfo in events)
{
// Type 객체에서 해당 Event 이름을 가진 Field를 가져온다.
var field = type.GetField(eventInfo.Name, AllBindings);
if (field == null)
continue;
// 실제 전달된 객체에서 EventHandler를 가져온다.
var eventHandler = field.GetValue(obj) as Delegate;
if (eventHandler == null)
continue;
nameList.Add(eventInfo.Name);
}
}
이런 식으로 핸들러가 등록된 이벤트들을 가져오려고 하는데요.
제가 임의로 추가한 이벤트들은 잘 가져와 집니다.
그런데 FrameworkElement 객체들은 대체로 저 type.GetField(eventInfo.Name, AllBindings) 구문에서 null이 떨어지더군요.
확인해보니 FrameworkElement 객체들은 매우 제한적인 필드 멤버만을 가지고 있었습니다. (DP 몇 개만 필드 멤버로 가지고 있더군요.)
일단 GetEvent()나 GetEvents()에만 검색이 가능하고, 아니면 가장 포괄적으로 GetMember/GetMembers()에서만 검색할 수 있었습니다.
그런데 MemberInfo 객체는 GetValue() 메서드가 없더군요.(좌절...;ㅅ;)
이래저래 뻘짓을 많이 해봤는데 결국 이벤트를 가져오는 방법은 못 찾았습니다.
혹시 방법을 아시면 구원의 손길을 내려 주시옵소서....(__)
[최초 등록일: ]
[최종 수정일: 4/30/2012]