2009-06-05 8 views
0

Disons que je ne peux pas modifier la classe A.Encapsuler un événement dans une méthode?

J'ai cela dans un class A<T>, il existe une méthode JumpNext():

public void JumpNext(); 

Il déclenche un événement dans class A<T>, appelé Next

Et ceci dans ma classe B:

public T Next() 
{ 
    instanceofA.JumpNext(); 
    //instanceofA.Next += something; 
    // wait for event 
    // someting(object sender, AEventArgs e) 
    //return e.Entry 
} 

Le problème est, que m y Next méthode doit renvoyer l'instance de T contenue dans le champ Entry de AEventArgs retourné par l'événement A.Next. Alors, comment puis-je faire cela à l'intérieur d'une méthode de classe B? J'utilise .NET 2.0, mais si c'est possible dans n'importe quelle version ultérieure seulement, cela pourrait aussi bien se passer.

Répondre

2

Vous pouvez faire quelque chose comme ça:

public void T Next() 
    { 
     T value = default(T); 
     EventHandler<AEventArgs> handler = new EventHandler<AEventArgs>(delegate(object sender, AEventArgs e) { value = e.Entry; }); 
     instanceofA.Next += handler; 
     instanceofA.JumpNext(); 
     instanceofA.Next -= handler; 
     return value; 
    } 
+0

modifié pour utiliser les e 2.0 de syntaxe e OP demandé. –

+0

Battez-moi par une minute. Je note que la syntaxe de la fonction lamba n'est pas une caractéristique de C# 2.0, donc la solution de Thomas Levesque exigerait que vous utilisiez une version plus récente du framework. Une bonne discussion de la différence est à http://blogs.msdn.com/ericlippert/archive/2007/01/10/lambda-expressions-vs-anonymous-methods-part-one.aspx. Notez également que vous devez gérer la possibilité que JumpNext() se lance, d'où le blocage définitif dans ma solution. – anelson

+0

@Jonathan: Merci pour l'édition;) - @anelson: oui, il vaudrait mieux utiliser un bloc try/finally, je l'ai simplement omis par souci de simplicité ... –

3

Si je comprends bien votre question, vous voulez gérer l'événement A.Next dans la méthode B.Next(). Vous pouvez le faire avec un anonymous method,, mais vous devez faire attention de ne pas enregistrer le gestionnaire d'événements plus d'une fois:

Dites l'événement suivant est défini comme un délégué a déclaré ainsi:

public delegate vote NextHandler(object sender, AEventArgs e); 

que vous pourriez faire:

public T Next() 
{ 
    T entry; 
    NextHandler handler = delegate(object sender, AEventArgs e) { 
     entry = e.entry; 
    } 

    instanceOfA.Next += handler; 
    try { 
     instanceOfA.JumpNext(); 
    } finally { 
     instanceOfA -= handler; 
    } 

    return entry; 
} 
+0

Bon appel sur l'utilisation de la clause finally dans le cas où JumpNext lève une exception. –

+0

Modifié pour corriger l'erreur de compilation dans le délégué. – anelson

0

Je l'ai fait la combinaison des deux:

public T Next() 
{ 
    T entry = default(T); 
    EventHandler<AEventArgs> handler = delegate(object sender, AEventArgs e) 
    { 
     entry = e.Entry; 
    }; 
    instanceofA.Next+= handler; 
    try 
    { 
     instanceofA.JumpNext(); 
    } 
    finally 
    { 
     instanceofA.Next-= handler; 
    } 
    return entry; 
}