public으로 노출되지 않은 다른 어셈블리의 delegate 인스턴스를 Reflection으로 생성하는 방법
가끔, 디버깅을 위해 public이 아닌 .NET BCL의 멤버를 Reflection을 이용해 건드려야 할 경우가 종종 있습니다. 예를 들어, System.Web.HttpCookieCollection 타입에는 다음과 같이 콜백 메서드를 담은 필드가 하나 있는데,
internal delegate void ValidateStringCallback(string key, string value);
private ValidateStringCallback _validationCallback;
Reflection을 이용해 저 값을 설정하고 싶다면 어떻게 해야 할까요? 어차피 필드 접근이야 FieldInfo를 구하면 가능한데, ValidateStringCallback 타입의 인스턴스는 delegate이기 때문에 System.Delegate 생성 절차에 따라 인스턴스를 만들어야 합니다. 일례로 다음과 같이 만들어 줄 수 있습니다.
class Program
{
public static void Callback(string key, string value)
{
}
private static void SetCallback(HttpCookieCollection hcc)
{
MethodInfo ci = typeof(Program).GetMethod("Callback", BindingFlags.Public | BindingFlags.Static);
Assembly asm = Assembly.GetAssembly(typeof(HttpCookieCollection));
Type delegateType = asm.GetType("System.Web.ValidateStringCallback");
Delegate di = Delegate.CreateDelegate(delegateType, ci);
Type type = typeof(HttpCookieCollection);
FieldInfo fi = type.GetField("_validationCallback", BindingFlags.NonPublic | BindingFlags.Instance);
fi.SetValue(hcc, di);
}
}
(
첨부 파일은 이 글의 예제 코드를 포함합니다.)
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]