具有已知事件签名的C#2.0动态事件订阅

时间:2009-09-29 11:53:30

标签: c# events reflection dynamic

与此问题类似:

C# Dynamic Event Subscription

我希望能够将事件处理程序连接到从动态创建的对象中触发的事件。我这样做是为了验证我的JavaScript和其他非.NET代码能够连接到对象的事件。

我在对象中的事件签名是:

委托void MediaItemFellbackDelegate(int id,string name,string path);

这是我的'DynamicHost'代码:

public delegate void MediaItemFellbackDelegate(int id, string name, string path);

public void MediaItemFellback(int id, string name, string path)
{
}


private void HandleEvent(string eventName, Delegate handler)
{
  try
  {
    BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
    EventInfo mediaItemFellback = m_PlayerType.GetEvent(eventName, bindingFlags);
    mediaItemFellback.AddEventHandler(m_Player, handler);
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.ToString());
  }
}

HandleEvent("MediaItemFellback", new MediaItemFellbackDelegate(this.MediaItemFellback));

但最终有例外:

  

类型的对象   'DynamicHost.Main + MediaItemFellbackDelegate'   无法转换为类型   'Player.MediaItemFellbackDelegate'。

在AddEventHandler()调用中

当然,它们是不同的类型,但签名是相同的。

这里出了什么问题?

1 个答案:

答案 0 :(得分:3)

很简单,您无法使用错误的委托订阅订阅活动。

您可以做的是在HandleEvent中创建正确类型的委托:

private void HandleEvent(string eventName, Delegate handler)
{
  try
  {
    BindingFlags bindingFlags = BindingFlags.Instance | 
                                BindingFlags.Public | BindingFlags.NonPublic;
    EventInfo mediaItemFellback = m_PlayerType.GetEvent(eventName, bindingFlags);
    Delegate correctHandler = Delegate.CreateDelegate(
        mediaItemFellback.EventHandlerType, handler.Target, handler.Method);
    mediaItemFellback.AddEventHandler(m_Player, correctHandler);
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.ToString());
  }
}