Prenons l'exemple d'une classe qui a des événements. Cette liste d'événements va s'allonger. Certains sont facultatifs. D'autres sont obligatoires.
Pour simplifier la validation initiale, je dispose d'un attribut personnalisé qui marque un événement comme étant obligatoire. Par exemple :
[RequiredEventSubscription("This event is required!")]
public event EventHandler ServiceStarted;
Jusqu'à présent, tout va bien. Pour valider tous les événements, j'utilise la réflexion pour itérer la liste des événements et récupérer les attributs personnalisés. Mais j'ai besoin d'un moyen de déterminer si l'événement est souscrit ou non.
Sans réflexion, ServiceStarted.GetInvocationList fait le travail. Mais l'événement doit provenir de cette liste : var eventList = this.GetType().GetEvents().ToList() ;
Existe-t-il un moyen de vérifier si un événement donné, à partir d'une liste d'événements, est souscrit en utilisant la réflexion ?
--[Mise à jour]-- Voici une solution possible basée sur la réponse d'Ami :
private void CheckIfRequiredEventsAreSubscribed()
{
var eventList = GetType().GetEvents().ToList().Where(e => Attribute.IsDefined(e, typeof(RequiredEventSubscription)));
StringBuilder exceptionMessage = new StringBuilder();
StringBuilder warnMessage = new StringBuilder();
foreach (var evt in eventList)
{
RequiredEventSubscription reqAttr = (RequiredEventSubscription) evt.GetCustomAttributes(typeof(RequiredEventSubscription), true).First();
var evtDelegate = this.GetType().GetField(evt.Name, BindingFlags.Instance | BindingFlags.NonPublic);
if (evtDelegate.GetValue(this) == null)
{
warnMessage.AppendLine(reqAttr.warnMess);
if (reqAttr.throwException) exceptionMessage.AppendLine(reqAttr.warnMess);
}
}
if (warnMessage.Length > 0)
Console.WriteLine(warnMessage);
if (exceptionMessage.Length > 0)
throw new RequiredEventSubscriptionException(exceptionMessage.ToString());
}
Merci beaucoup !