Comment appeler manuellement un événement?
J'ai la ligne suivante en C#:
_timer.ElapsedTick += _somefunction1;
_timer.ElapsedTick += _somefunction2;
_timer.ElapsedTick += _somefunction3;
Comment appeler toutes les méthodes abonné à _timer.ElapsedTick sans préciser la _somefunction ? Quelque part le long de cette pseudo-ligne
invoke(_timer.ElapsedTick);
Votre aide est très apprécié.
Mise à jour
Exemple de @M. Babcock est de travail. Le FireEvent méthode de la magie. Merci.
class InvokeFromMe
{
public event EventHandler RaiseMe;
}
class MainClass
{
public MainClass()
{
InvokeFromMe fromMe = new InvokeFromMe();
fromMe.RaiseMe += fromMe_RaiseMe;
fromMe.RaiseMe += fromMe_RaiseMe1;
FireEvent(fromMe, "RaiseMe", null, EventArgs.Empty);
//works
System.Timers.Timer _timer = new System.Timers.Timer();
_timer.Elapsed += _timer_Elapsed;
FireEvent(_timer, "onIntervalElapsed", null, null);
//throws exception
}
private void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
Console.WriteLine("_timer_Elapsed raised");
}
private void fromMe_RaiseMe(object sender, EventArgs e)
{
Console.WriteLine("Event Handler 0 Raised");
}
private void fromMe_RaiseMe1(object sender, EventArgs e)
{
Console.WriteLine("Event Handler 1 Raised");
}
public void FireEvent(object onMe, string invokeMe, params object[] eventParams)
{
MulticastDelegate eventDelagate =
(MulticastDelegate)onMe.GetType().GetField(invokeMe,
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.NonPublic).GetValue(onMe);
Delegate[] delegates = eventDelagate.GetInvocationList();
foreach (Delegate dlg in delegates)
{
dlg.Method.Invoke(dlg.Target, eventParams);
}
}
}
class Program
{
static void Main(string[] args)
{
MainClass m = new MainClass();
}
}
source d'informationauteur Jeson Martajaya
Vous devez vous connecter pour publier un commentaire.
Peut-il être fait à l'aide de la traditionnelle C#? Aucun (comme indiqué précédemment). Mais l'utilisation de la réflexion, c'est possible. Voici quelques testé le code basé sur la réponse à ce forum MSDN fil:
Mise à JOUR
Je ne suis pas familier avec le
System.Timer.Timer
classe, donc je ne suis pas sûr de ce qui est différent de mon exemple fourni. Vous pourriez peut-être essayer quelque chose comme:Vous ne pouvez pas invoquer un événement qui est détenue par un autre type. Un événement ne peut être invoqué à partir de l'intérieur de la classe qui le déclare.
C'est un travail autour de vous, vous ne pouvez pas faire une boucle par l'événement Écoulée. Mais à les invoquer à tout, laisse le temps faire le travail. Ce code pour le Système.Minuteur, pas sûr de la minuterie que vous utilisez.
De présumer de la minuterie est déjà activé:
Quelque chose comme qui va déclencher les événements, mais l'original de votre intervalle sera redémarré. Vous pourriez avoir à faire quelques calculs en y si vous voulez garder l'original tique modèle.
Vous pouvez créer une fonction qui s'exécute tous les:
Je pense que vous avez probablement besoin d'utiliser InvokeMember:
Puis l'appeler comme ceci:
Assurez-vous d'inclure ceci:
Bonne Chance!
Basé sur M. Babcock réponse ci-dessus, avec quelques légères méthode de réflexion mises à jour.
Remplacé
GetField
avecGetTypeInfo
etGetDeclaredField
etdlg.Method
avecdlg.GetMethodInfo
.bien je termine ici sur la recherche de la façon de simplement de début de l'événement, qui est de ne pas avoir tous les arguments ou quoi que ce soit. Je sais OP question, c'est différent! mais j'ai eu l'aime partager, j'espère que cela aide quelqu'un.
Unsimplify version:
Simplifier version:
Selon la signature de la
ElapsedTick
cas, vous pouvez déclencher l'événement par l'appelant comme une méthode à partir de l'intérieur de la classe dans laquelle elle est déclarée. Par exemple:Vous pouvez uniquement appeler les événements de l'intérieur de la classe qui le déclare. Si vous avez écrit la classe timer, vous l'appeler comme ceci:
À l'extérieur de la classe timer vous pouvez faire comme suit pour obtenir un comportement similaire:
delegateSample devrait effectivement être le type de la ElapsedTick événement, au lieu de déclarer un autre type de délégué. Je ne savais pas le nom de ce délégué. Assurez-vous juste d'ajouter chaque fonction de la ElapsedTick événement et le délégué variable que vous déclarez ensuite, vous pouvez les appeler tous par le délégué à l'extérieur de la classe Timer.