通用扩展方法无类型推断

通用扩展方法无类型推断,第1张

通用扩展方法无类型推断

对于感兴趣的任何人,到目前为止,我已经使用通用类层次结构解决了原始问题(流事件调用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);


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5150566.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-18
下一篇2022-11-18

发表评论

登录后才能评论

评论列表(0条)

    保存