2009-09-29 1 views
3

De même à cette question:C# 2.0 Dynamique Abonnement événement avec la signature d'événement connu

C# Dynamic Event Subscription

Je voudrais être en mesure de câbler un gestionnaire d'événements à un événement tiré d'un objet créé dynamiquement. Je fais cela pour vérifier que mon JavaScript et tout autre code non-.NET est capable de se connecter aux événements des objets.

Ma signature d'événement dans l'objet est:

délégué MediaItemFellbackDelegate void (int id, nom de chaîne, chemin de chaîne);

Voici mon code '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)); 

mais je me retrouve à l'exception:

objet de type 'DynamicHost.Main + MediaItemFellbackDelegate' ne peut pas être convertie en type 'Player.MediaItemFellbackDelegate'.

dans l'appel AddEventHandler().

Bien sûr, ils sont différents types, mais les signatures sont identiques.

Qu'est-ce qui ne va pas ici?

Répondre

3

Tout simplement, vous ne pouvez pas souscrire à un événement en utilisant le mauvais type de délégué.

Ce que vous pouvez faire est de créer le droit type de délégué 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

You rock! Tous les exemples que j'ai pu trouver descendent dans la génération IL, donc merci pour votre réponse. Tu gères! – JBRWilkinson