2012-02-10 3 views
1

약간의 도움이 필요합니다!바디 소스 코드가 변수에 저장되는 컨트롤에 런타임에 이벤트 처리기를 추가하십시오.

런타임에 사용자 정의 컨트롤을 만들고 정보가 들어있는 xml을 deserialize하고 있습니다. 내 사용자 지정 컨트롤에는 두 가지 속성이 있습니다. 하나는 이벤트 이름, 다른 하나는 이벤트 발생시 실행할 코드 (즉, 메서드 본문)입니다.

나는 두 변수에서 값을 추출합니다. 필요한 것은 런타임에 변수에 저장된 코드를 실행하는 이벤트에 대한 컨트롤을 추가하고 처리하는 것입니다.

string eventName = "Click"; 
string codeToRun= "MessageBox.Show(\"Hello!\");" 
Type tControl = result.GetType(); 
EventInfo ev = tControl.GetEvent(eventName); 
Type tDelegate = ev.EventHandlerType; 
MethodInfo addHandler = ev.GetAddMethod(); 

Type returnType = tDelegate.GetMethod("Invoke").ReturnType; 

ParameterInfo[] parameters = tDelegate.GetMethod("Invoke").GetParameters(); 
Type[] typeParameters = new Type[parameters.Length]; 
for (int i = 0; i < parameters.Length; i++) 
{ 
    typeParameters[i] = parameters[i].ParameterType; 
} 

DynamicMethod handler = new DynamicMethod(
         "", 
         null, 
         typeParameters); 

//here I need to compile and add my custom source code stored in codeToRun 

Delegate dEmitted = handler.CreateDelegate(tDelegate); 
addHandler.Invoke(result, new Object[] { dEmitted }); 

의견이 있으십니까? 도움을 주셔서 감사합니다.

답변

1

처음에는 addHandler 메서드를 가져 오는 이유가 명확하지 않습니다. 전화 할 수 없습니까?

ev.AddEventHandler(result, dEmitted); 

? 델리게이트를 올바르게 작성했다면, 이는 잘해야하며 add 핸들러 메소드를 직접 호출하는 것보다 간단합니다.

동적 메서드를 만드는 것이 실제로 다른 문제입니다. CSharpCodeProvider을보고 어셈블리를 동적으로 컴파일하는 것이 좋습니다. 나는 그것을 이벤트 핸들링 부분과는 완전히 별개로 다루는 것으로서 취급 할 것이다 - 컴파일 작업을 얻은 다음 나중에 이벤트 핸들러 연결을 얻는다.

CSharpCodeProvider을 어떻게 사용할 수 있는지에 대한 예제로 Snippy의 소스 코드를보고 싶을 수도 있습니다. 그 코드는 깊이있는 C# 용으로 작성한 간단한 도구로 코드 스 니펫을 컴파일하고 실행할 수 있습니다.

+0

좋아, 나는 당신의 제안에 따라 간단하게 만들었습니다. 하지만 이제는 질문을합니다. 실행하려는 코드 (예 : codeToRun에 저장되어있는 코드)를 대리인 본문에 어떻게 추가 할 수 있습니까? CSharpCodeProvider의 도움으로? 나는 그것을하는 예제를 찾지 못했습니다. – kikka