栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

通用扩展方法无类型推断

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

通用扩展方法无类型推断

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/442709.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号