J'utilise le modèle EventAgregator pour m'abonner et publier des événements. Si un utilisateur s'abonne à l'événement à l'aide d'une expression lambda, il doit utiliser une référence forte et non une référence faible, sinon l'expression peut être collectée avant que la publication s'exécute.Comment savoir si une action est une expression lambda?
Je voulais ajouter une simple vérification dans le DelegateReference de sorte que si un programmeur passe une expression lambda et utilise une référence faible, que je lance une exception d'argument. C'est pour aider à "policer" le code.
Exemple:
eventAggregator.GetEvent<RuleScheduler.JobExecutedEvent>().Subscribe
(
e => resetEvent.Set(),
ThreadOption.PublisherThread,
false,
// filter event, only interested in the job that this object started
e => e.Value1.JobDetail.Name == jobName
);
public DelegateReference(Delegate @delegate, bool keepReferenceAlive)
{
if (@delegate == null)
throw new ArgumentNullException("delegate");
if (keepReferenceAlive)
{
this._delegate = @delegate;
}
else
{
//TODO: throw exception if target is a lambda expression
_weakReference = new WeakReference(@delegate.Target);
_method = @delegate.Method;
_delegateType = @delegate.GetType();
}
}
des idées? Je pensais que je pouvais vérifier @ delegate.Method.IsStatic mais je ne crois pas que cela fonctionne ... (toute expression lambda est-elle statique?)
donc il est maintenant possible de dire si un délégué est anonyme? Personnellement, je n'aime pas particulièrement le code WeakReference car une fois la durée de vie de votre classe terminée, si vous ne vous désabonnez pas, votre méthode peut être appelée plusieurs fois en arrière-plan (ou au moins la méthode de filtrage). Mais tel est le Microsoft "Best Practices". :) Je crois que silverlight, qui utilise ce modèle, lèvera une exception si vous essayez d'utiliser une référence faible avec un délégué anonyme ... alors je pensais que ce devrait être faisable. – Keith
@Keith - Je serais surpris si un 'new' était optimisé. –