
对于感兴趣的任何人,到目前为止,我已经使用通用类层次结构解决了原始问题(流事件调用API)。这基本上是Hightechrider对类固醇的回答。
public abstract class EventInvocatorParametersbase <TEventInvocatorParameters, TEventArgs> where TEventArgs : EventArgs where TEventInvocatorParameters : EventInvocatorParametersbase<TEventInvocatorParameters, TEventArgs>{ protected EventInvocatorParametersbase( EventHandler<TEventArgs> eventHandler, Func<Exception, bool> exceptionHandler, Func<TEventArgs, bool> breakCondition) { EventHandler = eventHandler; ExceptionHandler = exceptionHandler; BreakCondition = breakCondition; } protected EventInvocatorParametersbase( EventHandler<TEventArgs> eventHandler) : this(eventHandler, e => false, e => false) { } public Func<TEventArgs, bool> BreakCondition { get; set; } public EventHandler<TEventArgs> EventHandler { get; set; } public Func<Exception, bool> ExceptionHandler { get; set; } public TEventInvocatorParameters Until( Func<TEventArgs, bool> breakCondition) { BreakCondition = breakCondition; return (TEventInvocatorParameters)this; } public TEventInvocatorParameters WithExceptionHandler( Func<Exception, bool> exceptionHandler) { ExceptionHandler = exceptionHandler; return (TEventInvocatorParameters)this; } public ConfiguredEventInvocatorParameters<TEventArgs> With( object sender, TEventArgs eventArgs) { return new ConfiguredEventInvocatorParameters<TEventArgs>( EventHandler, ExceptionHandler, BreakCondition, sender, eventArgs); }}public class EventInvocatorParameters<T> : EventInvocatorParametersbase<EventInvocatorParameters<T>, T> where T : EventArgs{ public EventInvocatorParameters(EventHandler<T> eventHandler) : base(eventHandler) { }}public class ConfiguredEventInvocatorParameters<T> : EventInvocatorParametersbase<ConfiguredEventInvocatorParameters<T>, T> where T : EventArgs{ public ConfiguredEventInvocatorParameters( EventHandler<T> eventHandler, Func<Exception, bool> exceptionHandler, Func<T, bool> breakCondition, object sender, T eventArgs) : base(eventHandler, exceptionHandler, breakCondition) { EventArgs = eventArgs; Sender = sender; } public ConfiguredEventInvocatorParameters(EventHandler<T> eventHandler, object sender, T eventArgs) : this(eventHandler, e => false, e => false, sender, eventArgs) { } public T EventArgs { get; private set; } public object Sender { get; private set; }}public static class EventExtensions{ public static EventInvocatorParameters<TEventArgs> Until<TEventArgs>( this EventHandler<TEventArgs> eventHandler, Func<TEventArgs, bool> breakCondition) where TEventArgs : EventArgs { return new EventInvocatorParameters<TEventArgs>(eventHandler). Until(breakCondition); } public static EventInvocatorParameters<TEventArgs> WithExceptionHandler<TEventArgs>( this EventHandler<TEventArgs> eventHandler, Func<Exception, bool> exceptionHandler) where TEventArgs : EventArgs { return new EventInvocatorParameters<TEventArgs>(eventHandler). WithExceptionHandler(exceptionHandler); } public static ConfiguredEventInvocatorParameters<TEventArgs> With<TEventArgs>( this EventHandler<TEventArgs> eventHandler, object sender, TEventArgs eventArgs) where TEventArgs : EventArgs { return new ConfiguredEventInvocatorParameters<TEventArgs>( eventHandler, sender, eventArgs); }}Fire.Event(EventName.WithExceptionHandler(e => false) .Until(e => false).With(this, EventArgs.Empty));Fire.Event(EventName.With(this, EventArgs.Empty));Fire.Event(EventName.WithExceptionHandler(e => false) .With(this, EventArgs.Empty).Until(e => false));Fire.Event(EventName.With(this, EventArgs.Empty) .WithExceptionHandler(e => false).Until(e => false));
但这不允许您编写此代码,因为未提供所有必需的信息(eventArgs和sender):
Fire.Event(EventName.Until(e => false));Fire.Event(EventName);
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)