2012-02-10 2 views
1

Мне нужна небольшая помощь!Добавить обработчик события во время выполнения к элементу управления, где исходный код тела хранится в переменной

Я создаю пользовательский контроль во время выполнения, десериализуя xml, который содержит информацию. Мои пользовательские элементы управления имеют два свойства, одно с именем события, второе - с кодом, выполняемым при повышении события (т. Е. Тела метода).

Я извлекаю значения в двух переменных. Мне нужно добавить и обработать мой контроль во время выполнения для события, которое выполняет код, хранящийся в переменной.

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); 

? Если вы правильно создали делегата, это должно быть хорошо, и проще, чем напрямую обращаться к методу добавления обработчика.

Если ваш вопрос заключается в создании динамического метода, это другое дело: вы можете захотеть взглянуть на CSharpCodeProvider, чтобы скомпилировать исходный код в сборку динамически. Я бы рассматривал это как упражнение, полностью отделенное от части обработки событий, тем не менее, - заставьте компиляцию работать, а затем запустите обработчик обработчика событий.

Вы можете посмотреть исходный код для Snippy в качестве примера того, как вы можете использовать CSharpCodeProvider - это простой инструмент, который я написал для C# в Depth, который позволяет вам компилировать и запускать фрагменты кода.

+0

Хорошо, я сделал это простым в соответствии с вашим предложением. Но теперь вопрос в том, как я могу добавить к телу делегата код, который я хочу выполнить (тот, который хранится в codeToRun)? С помощью CSharpCodeProvider? Я не нашел примеров этого. – kikka