J'ai eu du mal à écrire un titre plus approprié à cette question - je vais essayer de le nettoyer quand je comprendrai mieux la solution et la bonne terminologie. : DComment agréger des événements à travers une collection d'objets identiques (même classe - différentes instances) à travers un autre 'objet d'agrégation'?
Il y a un motif qui se répète dans les deux derniers projets sur lesquels j'ai travaillé (les projets sont tous deux fortement pilotés par les événements).
Le modèle est:
public interface ISourceOfEvents {
event Action<EventInfo1> SomethingHappened1;
event Action<EventInfo2> SomethingHappened2;
{...}
}
public class SingleSourceOfEvents : ISourceOfEvents {
public event Action<EventInfo1> SomethingHappened1 = delegate { };
public event Action<EventInfo2> SomethingHappened2 = delegate { };
{...}
}
public class GroupSourceOfEvents : ISourceOfEvents {
public IList<ISourceOfEvents> SourceOfEventsGroup { get; private set; }
public event Action<EventInfo1> SomethingHappened1 = delegate { };
public event Action<EventInfo2> SomethingHappened2 = delegate { };
{...}
public GroupSourceOfEvents(IList<ISourceOfEvents> sourceOfEventsGroup) {
SourceOfEventsGroup = sourceOfEventsGroup;
foreach (var s in SourceOfEventsGroup) {
s.SomethingHappened1 += x => SomethingHappened1(x);
s.SomethingHappened2 += x => SomethingHappened2(x);
{...}
}
}
}
Ma question se résume à « comment puis-je faire pour le constructeur GroupSourceOfEvents
carte les liaisons d'événements automatiquement? ».
Actuellement, le code est difficile à maintenir car il existe plusieurs emplacements dans les projets pour lesquels de nouveaux événements doivent être ajoutés. L'interface ISourceOfEvents
me permet d'ajouter l'événement à un emplacement central et d'obtenir des erreurs de compilation partout où je dois ajouter l'événement mais j'ai besoin d'une solution similaire pour les mappages de classeurs d'événements dans le GroupSourceOfEvents
- ou pour qu'il soit complètement dynamique.
Je voudrais quelque chose de similaire à ceci:
// PSEUDO-CODE WARNING! :D
// PSEUDO-CODE WARNING! :D
// PSEUDO-CODE WARNING! :D
public GroupSourceOfEvents(IList<ISourceOfEvents> sourceOfEventsGroup) {
SourceOfEventsGroup = sourceOfEventsGroup;
var events = typeof(ISourceOfEvents).GetEvents();
foreach (var s in SourceOfEventsGroup) {
foreach (var e in events) {
e.AddEventHandler(s, e.GetRaiseMethod(this));
}
}
}
La moitié de mon problème est la cartographie des paramètres ensemble. Dans le code qui fonctionne actuellement (le top sample), une expression lambda est utilisée mais je ne suis pas sûr de savoir comment cela peut être réalisé en utilisant le 'style' de la technique que j'utilise dans mon pseudo code (l'échantillon du bas). L'autre moitié de mon problème est que GetRaiseMethod(this)
renvoie MethodInfo
par opposition à delegate
(ce qui est ce que je devrais utiliser AddEventHandler
) et je ne sais pas comment "obtenir" le delegate
.
Toute aide serait grandement appréciée. Je suis également ouvert à différents modèles ou approches qui peuvent être plus standard (si ce n'est pas le cas).
J'utilise C# et .Net 4.