C# 在运行时将事件处理程序添加到将主体源代码存储在变量中的控件

C# 在运行时将事件处理程序添加到将主体源代码存储在变量中的控件,c#,reflection,event-handling,dynamicmethod,C#,Reflection,Event Handling,Dynamicmethod,我需要一点帮助 我在运行时创建自定义控件,反序列化包含信息的xml。 我的自定义控件有两个属性,一个是事件名称,第二个是事件引发时要执行的代码(即方法体) 我提取两个变量中的值。我需要的是在运行时为执行变量中存储的代码的事件向控件添加和处理程序 string eventName = "Click"; string codeToRun= "MessageBox.Show(\"Hello!\");" Type tControl = result.GetType(); EventInfo ev = t

我需要一点帮助

我在运行时创建自定义控件,反序列化包含信息的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 });
string eventName=“单击”;
字符串codeToRun=“MessageBox.Show(\“Hello!\”)
类型tControl=result.GetType();
EventInfo ev=tControl.GetEvent(eventName);
类型tDelegate=ev.EventHandlerType;
MethodInfo addHandler=ev.GetAddMethod();
类型returnType=tDelegate.GetMethod(“Invoke”).returnType;
ParameterInfo[]parameters=tDelegate.GetMethod(“调用”).GetParameters();
Type[]typeParameters=新类型[parameters.Length];
对于(int i=0;i
有什么建议吗?
提前感谢您的帮助

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

ev.AddEventHandler(result, dEmitted);
??如果您已经正确创建了委托,这应该很好,并且比直接调用addhandler方法更简单

如果您的问题实际上是关于创建动态方法的,那就不同了:您可能希望了解如何将源代码动态编译成程序集。不过,我会将其视为一个完全独立于事件处理部分的练习——让编译工作起来,然后让事件处理程序连接工作起来


您可能想看看源代码,作为如何使用
CSharpCodeProvider
的示例—这是我为C#Depth编写的一个简单工具,它只允许您编译和运行代码片段。

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

ev.AddEventHandler(result, dEmitted);
??如果您已经正确创建了委托,这应该很好,并且比直接调用addhandler方法更简单

如果您的问题实际上是关于创建动态方法的,那就不同了:您可能希望了解如何将源代码动态编译成程序集。不过,我会将其视为一个完全独立于事件处理部分的练习——让编译工作起来,然后让事件处理程序连接工作起来


您可能想看看源代码,以了解如何使用
CSharpCodeProvider
——这是我为C#Depth编写的一个简单工具,它只允许您编译和运行代码片段。

好的,我根据您的建议简化了它。但现在的问题是,如何将我要执行的代码(存储在codeToRun中的代码)添加到委托体中?在CSharpCodeProvider的帮助下?我没有找到这样的例子。好吧,我已经根据你的建议把它简单化了。但现在的问题是,如何将我要执行的代码(存储在codeToRun中的代码)添加到委托体中?在CSharpCodeProvider的帮助下?我没有找到这样的例子。