在运行时将事件处理程序添加到控件,其中正文源代码存储在变量中

时间:2012-02-10 14:39:05

标签: c# reflection event-handling dynamicmethod

我需要一些帮助!

我在运行时创建自定义控件,反序列化包含信息的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 个答案:

答案 0 :(得分:1)

我不清楚为什么你首先提取addHandler方法。你不能打电话:

ev.AddEventHandler(result, dEmitted);

?如果你已经正确地创建了委托,那应该没问题,并且比直接调用add handler方法更简单。

如果您的问题实际上是关于创建动态方法,那么这是另一回事:您可能希望查看CSharpCodeProvider以动态地将源代码编译到程序集中。我会把它当作一个完全独立于事件处理部分的练习 - 让编译工作,然后让事件处理程序连接工作。

您可能希望查看Snippy的源代码作为如何使用CSharpCodeProvider的示例 - 这是我在深度中为C#编写的一个简单工具,它只是让您编译和运行代码片段。