C# 将委托动态绑定到事件
我有一个方法可以将页面上的方法绑定到动态创建的C# 将委托动态绑定到事件,c#,reflection,delegates,C#,Reflection,Delegates,我有一个方法可以将页面上的方法绑定到动态创建的LinkButtons protected virtual void AddDynamicHandlerToControl(Page page, Control controlInstance, string methodName, string eventName) { Delegate d = null; EventInfo ei = controlInstance.GetType().GetEvent(ev
LinkButton
s
protected virtual void AddDynamicHandlerToControl(Page page, Control controlInstance,
string methodName, string eventName)
{
Delegate d = null;
EventInfo ei = controlInstance.GetType().GetEvent(eventName);
Type tDelegate = ei.EventHandlerType;
MethodInfo method = page.GetType().BaseType.GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
if (method != null)
d = Delegate.CreateDelegate(tDelegate, page, method);
else {
FieldInfo field = page.GetType().BaseType.GetField(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
if (field != null)
{
d = field.GetValue(page) as Delegate;
}
}
MethodInfo addHandler = ei.GetAddMethod();
object[] addHandlerArgs = { d };
addHandler.Invoke(controlInstance, addHandlerArgs);
}
这适用于该页面内的方法。我想添加的是对用户控件内部方法的支持。因此,我在代码隐藏页面中创建了一个委托
,并在运行时将其分配给用户控制方法
我创建并分配代理,如下所示:
protected event PrintPageMethod PrintPage;
protected delegate void PrintPageMethod(object sender, EventArgs e);
然后:
PrintPage = DetailedTestsResult1.UserActionsForTests1_PrintPage;
代码尝试查找方法,当未找到方法时,它尝试查找委托的字段并找到正确的委托,该委托指向以用户控件类为目标的正确方法
问题是当addHandler.Invoke(controlInstance,addHandlerArgs)时到达代码>时,它作为异常抛出
“SomePage+PrintPageMethod”类型的对象无法转换为“System.EventHandler”类型
我也不知道我做错了什么。而不是:
protected event PrintPageMethod PrintPage;
protected delegate void PrintPageMethod(object sender, EventArgs e);
使用:
尽管签名相似,但委托类型不同。您不能将委托强制转换为其他委托
d=field.GetValue(第页)作为委托;
到
Delegate orig=field.GetValue(第页)作为委托;
d=委托。合并(
orig.GetInvocationList()
.Select(=>Delegate.CreateDelegate(tDelegate、0.Target、0.Method))
.ToArray()
);
您可以从.target
和.Method
使用调用目标创建另一个委托
,如果委托有多个目标,则必须组合每个委托。这似乎是一种解决方法,而不是修复方法。代码似乎应该看到PrintPage
事件的类型为PrintPageMethod
,并创建一个PrintPageMethod
委托。谢谢!事件如果这是一个解决方法(我仍然不明白为什么使用委托不起作用),这就解决了我的问题。显示完整的用户控件(与事件相关的东西)@jgauffin-我本来会添加usercontrol代码,但由于委托是指向函数的指针,我看不到显示函数本身的相关性。例外情况不是将函数分配给委托,而是将委托分配给事件句柄。
protected event EventHandler PrintPage;