0

カスタムFormクラスで作成されたフォーム要素にイベントをバインドしようとしています。UserControlファイルであるFormLoaderクラスに存在するメソッドをバインドする方法についてはまったくわかりません。元:

 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");
    }

「ターゲットメソッドへのバインド中にエラーが発生しました」というメッセージが表示されます。スコープ外に存在するイベントのメソッドをバインドする方法はありますか?

4

1 に答える 1

1

その引数としてDelegate.CreateDelegate取る過負荷はありません。Type, Type, MethodInfoその結果、最初の引数として渡して、Delegate.CreateDelegate(Type, Object, MethodInfo)オーバーロードを呼び出しています。typeof(FormLoader)

MethodInfo渡すのはクラスで定義されていないため、インスタンスTypeにバインドすることはできません。Type

FormLoaderクラスのインスタンスをメソッドの2番目のパラメーターとして渡す必要がありますCreateDelegate。イベントごとに新しいインスタンスを使用したくない場合は、インスタンスをAddEventメソッドに渡す必要があります。

于 2013-03-21T20:10:25.917 に答える