0

我想为我项目中的所有表单添加额外的事件处理程序。当每个表单Load event被触发时,除了 Form_Load() 中编写的代码之外,我的事件处理程序也将被执行。

这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Reflection;

namespace eventHandlerIntercept {    
   static class Program    {
      /// <summary>
      /// The main entry point for the application.
      /// </summary>
      [STAThread]
      static void Main()
      {

          Application.EnableVisualStyles();
          Application.SetCompatibleTextRenderingDefault(false);
          //intercept all form's Load event
          Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
          foreach (Assembly a in assemblies)
          {
              Type[] types = a.GetTypes();
              foreach (Type t in types)
              {
                  if (t.IsPublic && t.BaseType == typeof(Form))
                  {
                      if (t.Namespace.Contains("eventHandlerIntercept"))    
                      {                        
                        EventInfo e1 = t.GetEvent("Load");

                        MethodInfo mi = typeof(Program).GetMethod("HandleCustomEvent");

                        Delegate handler = Delegate.CreateDelegate(e1.EventHandlerType, mi);

                        object o1 = Activator.CreateInstance(t);
                        e1.AddEventHandler(o1, handler);

                    }
                }
            }
         }
         Application.Run(new Form1());
    }


    public static void HandleCustomEvent(object sender, EventArgs a)
    {
        // Do something useful here.
        MessageBox.Show("xyz");
    }
  }
 }

这段代码编译没有错误,但是当Form1显示时,它没有显示message box内容是xyz什么,我的代码哪里有问题?

4

2 回答 2

1

你可以试试这个:

Form myForm = new Form();
myForm.Load += HandleCustomEvent;
Application.Run(myForm);

这对我有用,但MessageBox它显示在表格本身之前,我不知道这对你是否重要。不过,希望这有帮助,请反馈。

于 2013-03-08T06:24:58.700 回答
1

没有办法通过尝试对类型执行某些操作来“拦截所有表单的 Load 事件”。OnLoad 事件是实例事件,因此无法在创建派生对象的实例之前添加处理程序。Form

您的代码实际上创建了所有 From 派生类的实例并添加了侦听器,但是您完全忽略了结果对象并创建了一个新对象以调用Run. 要使该方法起作用,您需要将o1对应的Form1类型传递给Run方法。

您可能想要编写某种工厂方法,该方法将按类型名称创建表单并立即附加您的处理程序。而且您可以在需要创建新表单的任何地方使用此方法(而不是直接调用构造函数)。

于 2013-03-08T06:04:37.297 回答