将委托添加到事件处理程序

时间:2011-02-07 14:19:22

标签: c# ms-word vsto

我正在尝试将一个委托添加到单词中的EventHandler,但在使用下面的代码时不断获得Argument Exception:

Type ty = this.Aplication.GetType().GetEvent("DocumentBeforeClose").EventHandlerType;
this.Application.GetType().GetEvent("DocumentBeforeClose").AddEventHandler(this,Delegate.CreateDelegate(ty, this, "test",false));

test只会弹出一个消息框。

有谁知道为什么会这样。

1 个答案:

答案 0 :(得分:0)

目前无法测试代码,但如果使用

则会怎样
this.Application.GetType().GetEvent("DocumentBeforeClose").AddEventHandler(this.Application,Delegate.CreateDelegate(ty, this, "test",false));

在AddEventHandler调用中看到this.Application而不是这个。

更新: 现在我可以测试代码,如果将“this”更改为“this.Application”,如前所述,它可以正常工作而无异常。这是完整的代码:

namespace WordTestAddin
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
          Type ty = this.Application.GetType().GetEvent("DocumentBeforeClose").EventHandlerType;
          var testDelegate = Delegate.CreateDelegate(ty, this, "test", false);
          this.Application.GetType().GetEvent("DocumentBeforeClose").AddEventHandler(this.Application, testDelegate);
        }

        void test(Word.Document Doc, ref bool Cancel)
        {
          System.Windows.Forms.MessageBox.Show("test");
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }

        #region VSTO generated code

        private void InternalStartup()
        {
          this.Startup += new System.EventHandler(ThisAddIn_Startup);
          this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }

        #endregion
    }
}

确保您的“测试”方法具有有效签名。还要确保“test”是确切的方法名称,而不是“Test”或其他东西。