Добавьте обработчик событий во время выполнения к элементу управления, где исходный код тела хранится в переменной - PullRequest
1 голос
/ 10 февраля 2012

Мне нужна небольшая помощь!

Я создаю пользовательский элемент управления во время выполнения, десериализацию 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 Ответ

1 голос
/ 10 февраля 2012

Мне не понятно, зачем вы берете метод addHandler.Разве вы не можете просто позвонить:

ev.AddEventHandler(result, dEmitted);

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

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

...