我正在尝试将事件绑定到在自定义Form类中创建的表单元素。关于如何绑定类FormLoader(UserControl文件)上存在的方法,我完全不知道。 例如:
public class FormBuilder
{
public Control Create(){
//create form controls here... for each control call AddEvent.
}
void AddEvent(object o, string eventname, string methodname)
{
EventInfo ei = o.GetType().GetEvent(eventname);
MethodInfo mi = typeof (FormLoader).GetMethod(methodname, BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Default);
Delegate del = Delegate.CreateDelegate(ei.EventHandlerType, typeof (FormLoader), mi);
ei.AddEventHandler(o, del);
}}
这是我实例化表单的方式。
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
Form = new Form();
Controls.Add(Form.Create());
}
public void ProcessEventAction(object sender, EventArgs e)
{
System.Diagnostics.Debug.WriteLine(@"Control Internal Hit");
}
我收到“绑定到目标方法的错误。”知道如何绑定存在于范围之外的事件的方法吗?
答案 0 :(得分:1)
没有Delegate.CreateDelegate
的重载,它以Type, Type, MethodInfo
为参数。因此,您正在调用Delegate.CreateDelegate(Type, Object, MethodInfo)
overload,并将typeof(FormLoader)
作为第一个参数传递。
由于您传入的MethodInfo
未在Type
类中定义,因此无法绑定到Type
实例。
您需要将FormLoader
类的实例作为CreateDelegate
方法的第二个参数传递。假设您不想为每个事件使用新实例,则需要将实例传递给AddEvent
方法。