【问题标题】:Enum and Dictionary<Enum, Action>枚举和字典<枚举,动作>
【发布时间】:2012-04-05 17:21:01
【问题描述】:

我希望我能以对每个人都清楚的方式来解释我的问题。 我们需要您对此提出建议。

我们有一个枚举类型,它定义了超过 15 个常量。 我们从 Web 服务接收报告并将其一列转换为此 Enum 类型。 根据我们从该网络服务收到的信息,我们使用 字典

我为什么要征求意见? 假设这些 Enum 内容中有 3 个满足我们字典中的特定功能,但其余的使用相同的功能。那么,有没有办法以更好的方式将它们添加到我们的字典中,而不是一个一个地添加它们?我还想保留这种结构,因为到时候,我们可能会在未来为我所说的“其余部分”提供特定的功能。

为了更清楚,这里是我们正在尝试做的一个例子:

枚举:

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,除非您有一些动态要求。
  • 您是说您可能会得到一组值,如果该组同时包含 ReasonD 和 ReasonE,您只想运行一次 HandleReasonGeneral 吗?
  • 对于 ReasonD 和 ReasonE 我想调用同一个函数。但我想以一种有效的方式将该函数添加到字典中。

标签: c# .net dictionary enums


【解决方案1】:

您可以尝试这样的事情,只需将自定义原因处理程序放入字典中,然后回退到通用处理程序。

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;
}

【讨论】:

  • 如果键不存在,索引器将抛出 KeyNotFoundException。最好改用 TryGetValue()。
  • 完美。这正是我一直在寻找的。谢谢! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 2012-11-17
  • 1970-01-01
  • 2013-02-25
  • 2010-10-15
  • 1970-01-01
相关资源
最近更新 更多