gpt4 book ai didi

c# - 创建处理多种事件类型的事件处理程序

转载 作者:太空狗 更新时间:2023-10-30 01:22:01 26 4
gpt4 key购买 nike

我今天浏览了一些旧代码,发现了一个看起来像这样的事件处理程序:

public void HandleEvent(EventClassA eventObj)
{
if(eventObj is EventSubClassA)
{
HandleEventSubClassA(eventObj as EventSubClassA);
}
else if(eventObj is EventSubClassB)
{
HandleEventSubClassB(eventObj as EventSubClassB);
}
else if(eventObj.GetType() == typeof(EventSubClassC))
{
HandleEventSubClassC(eventObj as EventSubClassC);
}
else if(eventObj is EventSubClassD)
{
HandleEventSubClassD(eventObj as EventSubClassD);
}
}

我觉得这有点丑陋。所以我这样重构它:

delegate void EventHandler(dynamic eventObj);
private static readonly Dictionary<Type, EventHandler> EVENT_MAP = new Dictionary<Type, EventHandler>()
{
{ typeof(EventSubClassA), HandleEventSubClassA },
{ typeof(EventSubClassB), HandleEventSubClassB },
{ typeof(EventSubClassC), HandleEventSubClassC },
{ typeof(EventSubClassD), HandleEventSubClassD }
};

public void HandleEvent(EventClassA eventObj)
{
EVENT_MAP[eventObj.GetType()](eventObj);
}

private void HandleEventSubClassA(dynamic evt)
{
var eventObj = evt as EventSubClassA;
}

我让一位同事审查了代码,与之前的解决方案相比,这个解决方案的工作方式令人担忧。我很难相信以前的解决方案是这种情况的最佳解决方案,所以我求助于 StackOverflow。

是否有更好的方法来构建此类类?是否有我不知道的专为此而设计的模式?

最佳答案

您可以使用泛型让您现有的解决方案稍微安全一些:

private static Dictionary<Type, Delegate> handlers;

static HandlerClass()
{
handlers = new Dictionary<Type, Delegate>();
AddHandler<EventSubClassA>(HandleEventSubClassA);
AddHandler<EventSubClassB>(HandleEventSubClassB);
...
}

public static void AddHandler<T>(Action<T> handler) where T : EventClassA
{
handlers[typeof(T)] = handler;
}

public void HandleEvent(EventClassA @event)
{
Delegate handler;
if(handlers.TryGetValue(@event.GetType(), out handler))
{
handler.DynamicInvoke(@event);
}
}

或者,如果您可以修改事件层次结构中的类,则可以实现访问者模式:

public interface IHandlers
{
void HandleSubClassA(EventSubClassA a);
void HandleSubClassB(EventSubClassB b);
...
}

public abstract class EventClassA
{
public abstract void Visit(IHandlers handlers);
}

public class EventSubClassA : EventClassA
{
public override void Visit(IHandlers handlers)
{
handlers.HandleSubClassA(this);
}
}

关于c# - 创建处理多种事件类型的事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14718049/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com