【发布时间】:2013-10-02 08:45:02
【问题描述】:
我有一个方法可以将页面上的方法绑定到动态创建的LinkButtons。
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);
}
这适用于该页面内的方法。我想添加的是对用户控件内部方法的支持。所以我在页面代码隐藏中创建了一个delegate,并在运行时为其分配了用户控制方法。
我这样创建和分配委托:
protected event PrintPageMethod PrintPage;
protected delegate void PrintPageMethod(object sender, EventArgs e);
然后:
PrintPage = DetailedTestsResult1.UserActionsForTests1_PrintPage;
代码尝试查找方法,当找不到方法时,它会尝试为委托查找字段并找到正确的委托,该委托以用户控件类为目标指向正确的方法。
问题是当到达addHandler.Invoke(controlInstance, addHandlerArgs);时,它会抛出异常
“SomePage+PrintPageMethod”类型的对象无法转换为“System.EventHandler”类型。
我不知道我做错了什么。
【问题讨论】:
-
显示完整的用户控件(事件相关的东西)
-
@jgauffin - 我会添加用户控件代码,但由于委托是指向函数的指针,我看不到显示函数本身的相关性。例外不是将函数分配给委托,而是将委托分配给事件处理程序。
标签: c# reflection delegates