2010-07-05 6 views
1

Comment faire lambda comme cegestionnaire d'événement Ajout et expression arbres

Action<EventHandler<TEventArgs>> adder = vs => GenericEvent += vs 

en utilisant des arbres d'expression. Ce code ne fonctionne pas:

Expression<Func<EventHandler<TEventArgs>>> handler =() => GenericEvent; 
var vs = Expression.Parameter(typeof(EventHandler<TEventArgs>), "vs");  
var adder = Expression.Lambda<Action<EventHandler<TEventArgs>>>(
      Expression.AddAssign(handler.Body, vs), vs).Compile(); 

Message d'erreur:

L'opérateur binaire AddAssign n'est pas défini pour les types de la System.EventHandler 1[ConsoleApplication.Program+SomeEventArgs]' and 'System.EventHandler 1 [ConsoleApplication.Program + SomeEventArgs].

Répondre

3

Bien pour commencer, vous devez être très clair dans votre esprit la différence entre les événements et les champs de délégués.

Nous ne pouvons pas dire ce que GenericEvent est dans le premier cas, mais si vraiment fait référence à un événement, qui appellerez add_GenericEvent ou quelle que soit la donne métadonnées sous-jacentes appropriées. Comparez cela avec le second cas, où vous voulez vraiment appeler Delegate.Combine, renvoyer le résultat à EventHandler<TEventArgs>, puis l'assigner à GenericEvent. Dans les deux cas, le compilateur C# utilise vraiment du sucre syntaxique - et vous devez décompacter ce sucre pour créer l'arbre d'expression approprié.

+0

Alors à quoi ressemblerait le code final? – l33t

+0

@ l33t: Sans plus de clarté dans la question, il est difficile d'écrire le code approprié. Si vous êtes dans une position similaire, mais ne pouvez pas le faire fonctionner, posez une nouvelle question avec un [mcve]. –

Questions connexes