通过C#中的反射在vs 2010中注册Office 2013事件的事件处理程序

时间:2013-05-02 13:09:38

标签: c# visual-studio-2010 outlook-addin office-2013

我有一个使用Visual Studio 2010用C#编写的Outlook 2010加载项项目。

由于加载项在Outlook 2013中整体运行,我只想稍作修改,以防止Outlook 2013中新的InlineResponse功能出现问题。

我想为InlineResponse事件注册一个eventhandler而不升级到VS 2012(因为删除了安装程序项目)。我读到了使用reflections 来获取新事件。

我没有任何异常,但事件不会触发我的处理程序(OnInlineResponse未被调用)。

public partial class ThisAddIn
{
   Outlook.Explorer _explorer;

   private void ThisAddIn_Startup(object sender, System.EventArgs e)
   {
       _explorer = Application.ActiveExplorer();

       AddInlineResponseHandler();
   }

   private void AddInlineResponseHandler()
   {
      var einfo = _explorer.GetType().GetEvent("InlineResponse", BindingFlags.Public | BindingFlags.Instance);

      if (einfo != null)
      {
         var handler = Delegate.CreateDelegate(einfo.EventHandlerType, this, this.GetType().GetMethod("OnInlineResponse", BindingFlags.NonPublic | BindingFlags.Instance), false);

         einfo.AddEventHandler(_explorer, handler);
      }

   }

   private void OnInlineResponse()
   {
      System.Windows.Forms.MessageBox.Show("InlineResponse");
   }
}

有关我如何达到预期行为的任何建议吗?

1 个答案:

答案 0 :(得分:1)

Gavin Smyth(撰写提到的关于使用反射的帖子)非常友好地回答了我们实现之间的差异:

  

from Gavin Smyth

     

我可以在你和我之间发现的唯一区别是OnInlineResponse接受一个参数,即新创建的邮件项目 - 请参阅http://msdn.microsoft.com/en-us/library/office/jj229061 - 即我的方法定义为:

private void OnInlineResponse(object item)
{
  ...
}