機能のためのメソッドを備えた列挙型(クラス/列挙型の組み合わせ)質問する

機能のためのメソッドを備えた列挙型(クラス/列挙型の組み合わせ)質問する

ここで何らかの点を見逃している可能性があります。その場合は、その議論を私の質問の一部として含めてください :)。

これは、作業コードの短縮および名前変更されたサンプルです。 はGetTicks(…)単一のサンプルであり、あらゆる種類の機能である可能性があります ( の値は> 0 < 9特定の Enum a.so を返す必要があります)。

public static class Something
{
    public enum TypeOf : short
    {
        Minute = 2, Hour = 3, Day = 4, …
    }

    public static long GetTicks(Something.TypeOf someEnum)
    {
        long ticks = 0;
        switch (someEnum)
        {
            case Something.TypeOf.Minute:
                ticks = TimeSpan.TicksPerMinute;
                break;
            case Something.TypeOf.Hour:
                ticks = TimeSpan.TicksPerHour;
                break;
         ....
        }
        return ticks;
    }
}

// This class is called from anywhere in the system.
public static void SomeMethod(string dodo, object o, Something.TypeOf period)
{
    // With the design above
    long ticks = Something.GetTicks(period);

    // Traditional, if there was a simple enum
    if (period == Something.Day)
        ticks = TimeSpan.FromDays(1).Ticks;
    else if (period == Something.Hour)
        ticks = TimeSpan.FromHours(1).Ticks;
}

アイデアは、 に関係する機能enumを にできるだけ近いところに集めることですenum。 はenum理由となる機能です。また、 の近くでそのような機能を探すのは簡単で自然だと思いますenum。また、 は変更や拡張も簡単です。

欠点は、 のenumように、 をより明示的に記述する必要があることです。デザインが非標準に見えるかもしれません。また、 がクラス内で内部使用するためのものであるSomething.TypeOf場合、それは適用されますか。enum

abstractこれをもっとうまく行うにはどうすればよいでしょうか? 、基本継承、 を試しましたpartial。どれも当てはまらないようです。

ベストアンサー1

もう少し書くことを気にしないのであれば、拡張メソッドを作成して のインターフェースを拡張することができますenum

例えば

public enum TimeUnit
{
   Second,
   Minute,
   Hour,
   Day,
   Year,
   /* etc */
}
public static class TimeUnitExtensions
{
    public static long InTicks(this TimeUnit myUnit)
    {
         switch(myUnit)
         {
           case TimeUnit.Second:
               return TimeSpan.TicksPerSecond;
           case TimeUnit.Minute:
               return TimeSpan.TicksPerMinute;
            /* etc */
         }
    }
}

これにより、列挙型に「インスタンス」メソッドを追加できます。ただし、一般的に好まれるものより少し冗長になります。

enumただし、は主に名前付きの値として扱う必要があることに注意してください。

おすすめ記事