具有功能方法的枚举(组合类/枚举)

Ind*_*ent 39 c#

我可能会在这里错过某种观点,如果是这种情况 - 请将该讨论作为我问题的一部分:).

这是一个缩短并重命名的工作代码示例.这GetTicks(…)是一个单一的样本,可以是任何类型的功能(值> 0 < 9应返回特定的枚举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;
}
Run Code Online (Sandbox Code Playgroud)

我们的想法是收集enum尽可能接近enum自身的功能.这enum是原因功能.此外,我发现在附近寻找这样的功能很容易和自然enum.此外,它很容易修改或扩展.

我的缺点是我必须说明enum更明确,比如Something.TypeOf.设计可能看起来不标准?它是否适用,如果enum是在课堂上内部使用的话.

你会怎么做得更好?我试过abstract,基础继承,partial.他们似乎都不适用.

Mic*_*l B 73

如果你不介意多写一些,你可以制作扩展方法来扩展界面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 */
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以为您的枚举添加"实例"方法.不过,它比大多数人更喜欢它.

请记住,a enum应该主要作为命名值处理.

  • @DavidHarkness,这是因为这行中的"this":public static long InTicks(this TimeUnit myUnit)."this"将TimeUnit关联到扩展名. (2认同)

Jon*_*eet 32

C#枚举不能像这样工作.但是,您可以非常轻松地实现自己的"固定值集":

public sealed class Foo
{
    public static readonly Foo FirstValue = new Foo(...);
    public static readonly Foo SecondValue = new Foo(...);

    private Foo(...)
    {
    }

    // Add methods here
}
Run Code Online (Sandbox Code Playgroud)

碰巧,我得到的一个例子与你的非常相似 - DateTimeFieldTypeNoda Time.有时您甚至可能希望将类打开,但保留私有构造函数 - 这允许您仅将嵌套类创建为子.非常方便限制继承.

缺点是你不能使用开关:(