Func <EventHandler, получить значение свойства из аргументов? - PullRequest
1 голос
/ 19 марта 2011

Я пытался решить эту проблему довольно долго, но безуспешно ... Моя идея заключалась в том, чтобы иметь какую-то конфигурацию для различных настроек, например ... для управления обработкой исключений.

Часть моего кода:)

public class ErrorEventArgs : EventArgs
{
   public bool Handled { get; set; }
...
...
}

Свойство в моем основном классе, как:

EventHandler<ErrorEventArgs> ErrorConfiguration {get; set;}

У меня тогда есть OnError, где мне нужно знать значение Handled,

internal void OnError(ErrorEventArgs args)
{
   Func<EventHandler<ErrorEventArgs>, bool> IsHandled;

   IsHandled = ev => ??? // invoke ErrorConfiguration?

   if (ErrorConfiguration != null && IsHandled(ErrorConfiguration ))
                error(this, args);
}

Как это можно решить?

Я могу сделать это, если это EventHandler без Func, но я хочу инкапсулировать логическое выражение. Почему я не могу зацепить лямбду ...: (

EventHandler<ErrorEventArgs> IsHandled;
IsHandled = (sender, e) => e.ErrorContext.Handled;

Ответы [ 2 ]

2 голосов
/ 19 марта 2011

Я не совсем уверен, чего именно вы хотите достичь. Но вы можете сделать что-то вроде:

IsHandled = ev => { ev(this, args); return args.Handled; };

Хотя я не уверен, что это более читабельно, быстрее, чище или что-то в этом роде. Я бы просто пошел с чем-то вроде

if (ErrorConfiguration != null) ErrorConfiguration(this, args);
if (!args.Handled) error(this, args);
1 голос
/ 19 марта 2011

Вам действительно не нужна лямбда, чтобы позвонить, просто позвоните своему делегату:

internal void OnError(ErrorEventArgs args)
{
   if (ErrorConfiguration != null)
       ErrorConfiguration(this, args);

   if (args.Handled)
       error(this, args);
}

Если вы хотите использовать то же самое в лямбда-выражении, вам придется сделать это, что займет больше строк кода:

internal void OnError(ErrorEventArgs args) {   
Func<EventHandler<ErrorEventArgs>, bool> IsHandled;

   IsHandled = ev => {
        ErrorConfiguration(this, ev);
        return ev.Handled;   
   };

   if (ErrorConfiguration != null && IsHandled(ErrorConfiguration ))
       error(this, args); 
}
...