枚举和Dictionary<枚举,操作>

4
我希望我能以清晰的方式解释我的问题,让大家都能明白。我们需要您对此提出建议。
我们有一个枚举类型,其中定义了15个以上的常量。我们从Web服务接收到一份报告,并将其一列翻译成该枚举类型。根据我们从Web服务接收到的内容,使用Dictionary运行特定的函数。
为什么我要寻求想法呢?假设这些枚举常量中有3个符合我们Dictionary中的特定功能,而其余的则使用相同的功能。那么,是否有一种更好的方法将它们添加到我们的Dictionary中,而不是逐个添加?我还想保留这种结构,因为在未来,我所描述的“其余”可能有特定的功能。
为了更加清楚,这里有一个示例,我们正在尝试实现:
枚举:
public enum Reason{
    ReasonA,
    ReasonB,
    ReasonC,
    ReasonD,
    ReasonE,
    ReasonF,
    ReasonG,
    ReasonH,
    ReasonI,
    ReasonJ,
    ReasonK
}

定义我们的字典:

public Dictionary<Reason, Action<CustomClassObj, string>> ReasonHandlers = new Dictionary<Reason, Action<CustomClassObj, string>>{
    { Reason.ReasonA, HandleReasonA },
    { Reason.ReasonB, HandleReasonB },
    { Reason.ReasonC, HandleReasonC },
    { Reason.ReasonD, HandleReasonGeneral },
    { Reason.ReasonE, HandleReasonGeneral },
    { Reason.ReasonF, HandleReasonGeneral },
    { Reason.ReasonG, HandleReasonGeneral },
    { Reason.ReasonH, HandleReasonGeneral },
    { Reason.ReasonI, HandleReasonGeneral },
    { Reason.ReasonJ, HandleReasonGeneral },
    { Reason.ReasonK, HandleReasonGeneral }
};

基本上我想问的是,有没有更加智能的方法来添加原因、功能对?因为您可以看到,在 ReasonC 之后,所有其他原因都使用相同的函数。

感谢您的建议。


这需要使用 switch,除非你有一些动态需求。 - leppie
1
你的意思是说,如果你得到一组值,且该组值包含ReasonD和ReasonE,你想只运行HandleReasonGeneral一次? - phoog
对于 ReasonD 和 ReasonE,我想调用同一个函数。但是我希望以高效的方式将该函数添加到字典中。 - Selçuk
1个回答

14
你可以尝试像这样做,只需将自定义的Reason处理程序放入字典中,然后回退到通用处理程序。
public Dictionary<Reason, Action<CustomClassObj, string>> ReasonHandlers = new Dictionary<Reason, Action<CustomClassObj, string>>{
    { Reason.ReasonA, HandleReasonA },
    { Reason.ReasonB, HandleReasonB },
    { Reason.ReasonC, HandleReasonC }};


public Action<CustomClassObj, string> ReasonHandlerLookup (Reason reason) {
    Action<CustomClassObj, string> result = null;
    ReasonHandlers.TryGetValue(reason, out result);
    return result ?? HandleReasonGeneral;
}

4
如果键不存在,索引器会抛出KeyNotFoundException异常。最好使用TryGetValue()方法代替。 - Adam Gritt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接