与此问题类似:
我希望能够将事件处理程序连接到从动态创建的对象中触发的事件。我这样做是为了验证我的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));
但最终有例外:
在AddEventHandler()调用中类型的对象 'DynamicHost.Main + MediaItemFellbackDelegate' 无法转换为类型 'Player.MediaItemFellbackDelegate'。
。
当然,它们是不同的类型,但签名是相同的。
这里出了什么问题?
答案 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());
}
}