4

私の問題を誰にとっても明白な方法で説明できることを願っています。これについての提案が必要です。

15を超える定数が定義されている列挙型があります。Webサービスからレポートを受け取り、その1つの列をこの列挙型に変換します。そして、そのWebサービスから受け取ったものに基づいて、辞書を使用して特定の機能を実行します

なぜ私はアイデアを求めているのですか?これらの列挙型定数のうち3つが辞書内の特定の関数を満たしているが、残りは同じ関数を使用しているとしましょう。それで、それらを1つずつ追加するのではなく、より良い方法で辞書に追加する方法はありますか?また、この構造を維持したいのは、その時が来たら、私が「残り」と表現したものに対して、将来的に特定の機能を持つ可能性があるからです。

より明確にするために、これが私たちがやろうとしていることの例です:

列挙型:

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の後でわかるように、他のすべての理由は同じ関数を使用しているためです。

ご提案ありがとうございます。

4

1 に答える 1

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;
}
于 2012-04-05T17:25:29.750 に答える