2009-09-29 48 views
3

与此相似的问题:C#2.0的动态事件订阅与已知的事件签名

C# Dynamic Event Subscription

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

的对象我的事件签名是:

委托无效MediaItemFellbackDelegate(INT ID,字符串名称,路径字符串);

这里是我的 '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()调用中。

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

这里怎么回事?

回答

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()); 
    } 
} 
+0

你摇滚!我能找到的所有例子都降临到IL一代,所以谢谢你的回答。你摇滚! – JBRWilkinson 2009-09-29 12:09:12