我需要一些帮助!
我在运行时创建自定义控件,反序列化包含信息的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 });
有什么建议吗?提前感谢您的帮助!
我不清楚为什么首先要获取addHandler
方法。你不能直接打电话给吗
ev.AddEventHandler(result, dEmitted);
如果您正确地创建了委托,那应该没问题,而且比直接调用add处理程序方法更简单。
如果你的问题实际上是关于创建动态方法,那就另当别论了:你可能想看看CSharpCodeProvider
,把源代码动态编译成一个程序集。不过,我会将其视为一个与事件处理部分完全分离的练习——让编译工作起来,然后让事件处理程序连接工作起来。
你可能想看看Snippy的源代码,作为如何使用CSharpCodeProvider
的例子——这是我为C#in Depth编写的一个简单工具,它只允许你编译和运行代码片段。