2012-04-05 68 views
4

我希望我能以一种对每个人都清楚的方式解释我的问题。 我们需要你的建议。Enum和Dictionary <Enum,Action>

我们有一个枚举类型,它定义了15个以上的常量。 我们收到来自Web服务的报告并将其一列转换为此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之后看到,所有其他原因使用相同的功能。

谢谢您的建议。

+0

这需要一个'switch',除非你有一些动态的要求。 – leppie 2012-04-05 17:22:39

+1

您是否在说可能会得到一组值,并且如果该集合包含ReasonD和ReasonE,那么您只想运行HandleReasonGeneral一次? – phoog 2012-04-05 17:24:02

+0

ReasonD和ReasonE我想调用相同的功能。但我想以有效的方式将该函数添加到字典中。 – selo 2012-04-05 17:27:31

回答

13

你可以尝试这样的事情,只把自定义的Reason处理程序放到字典中,然后回退到General。

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()来代替。 – 2012-04-05 17:28:40

+0

@AdamGritt你的权利,谢谢..我已经更新了代码。 – dmck 2012-04-05 17:32:10

+0

欢迎您。你有我的投票权。 – 2012-04-05 17:38:10