2011-03-19 43 views
1

已经尝试解决这个很长一段时间了,但没有运气......我的想法是有不同的设置的配置,例如..控制如何处理异常。Func <EventHandler,从args获取属性值?

我的一些代码:)

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

在我的主类的属性,如:

EventHandler<ErrorEventArgs> ErrorConfiguration {get; set;} 

然后我有一个地方的OnError我需要知道所处理的值,

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

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

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

这怎么解决?

我可以这样做,如果它是没有Func的EventHandler,但我想封装布尔表达式。为什么不能我链中的拉姆达... :(

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

我不要收到你的意愿。你能提供一个更全球化的样本吗?你希望你的事件处理程序能够跳过已处理的事件吗? – Zebi 2011-03-19 13:21:52

回答

2

我不完全确定你想要什么来实现的,究竟但你可以类似:

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

即使我我不知道这是更可读,更快,更干净,或类似的东西。我只想去像

if (ErrorConfiguration != null) ErrorConfiguration(this, args); 
if (!args.Handled) error(this, args); 
+0

非常好......谢谢:),正是我所需要的。 – Janus007 2011-03-19 18:36:58

1

你真的不需要任何lambda来呼叫你刚刚编辑打电话给你的委托直接:

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

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

如果你想使用在一个lambda同样的事情,你必须做这个,这将需要更多的代码:

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); 
} 
+0

我也喜欢那个......谢谢大家的帮助。 – Janus007 2011-03-20 09:55:25