2010-07-05 2 views
1

Как сделать лямбда, как этотДобавление обработчика событий и деревья выражений

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

с помощью деревьев выражений. Этот код не работает: сообщение

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(); 

Ошибка:

Бинарный оператор AddAssign не определен для типов 'System.EventHandler 1[ConsoleApplication.Program+SomeEventArgs]' and 'System.EventHandler 1 [ConsoleApplication.Program + SomeEventArgs]'.

ответ

3

Для начала нужно четко указать разницу между событиями и полями делегатов.

Мы не можем сказать, что GenericEvent в первом случае, но если это действительно делает относится к событию, которое будет вызовом add_GenericEvent или любого подходящие основные метаданные дают. Сравните это со вторым случаем, когда вы действительно хотите позвонить Delegate.Combine, верните результат обратно на EventHandler<TEventArgs>, а затем назначьте его обратно GenericEvent. В обоих случаях компилятор C# использует синтаксический сахар действительно - и вам нужно разблокировать этот сахар, чтобы создать соответствующее дерево выражений.

+0

Итак, как бы выглядел последний код? – l33t

+0

@ l33t: Без большей ясности в вопросе трудно написать соответствующий код. Если вы находитесь в аналогичной позиции, но не можете заставить его работать, задайте новый вопрос с помощью [mcve]. –

Смежные вопросы