Добавление обработчика событий и деревьев выражений - PullRequest
1 голос
/ 05 июля 2010

Как сделать лямбду подобной

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] '.

1 Ответ

3 голосов
/ 05 июля 2010

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

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

...