Enum with methods for functionality (Combine Class / Enum)

后端 未结 2 1713

I may miss some sort of point here, if that\'s the case - please include that discussion as a part of my question :).

This is a shortened down and renamed sample of a wo

相关标签:
2条回答
  • C# enums don't work well like this. However, you can implement your own "fixed set of values" fairly easily:

    public sealed class Foo
    {
        public static readonly Foo FirstValue = new Foo(...);
        public static readonly Foo SecondValue = new Foo(...);
    
        private Foo(...)
        {
        }
    
        // Add methods here
    }
    

    As it happens, one example I've got of this is remarkably similar to yours - DateTimeFieldType in Noda Time. Sometimes you might even want to make the class unsealed, but keep the private constructor - which allows you to create subclasses only as nested classes. Very handy for restricting inheritance.

    The downside is that you can't use switch :(

    0 讨论(0)
  • 2021-02-03 19:53

    If you don't mind a little more writing you can make extension methods to expand the interface of the enum.

    e.g.

    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 */
             }
        }
    }
    

    This can add "instance" methods to your enums. It's a bit more verbose than mostly liked, though.

    Remember though that an enum should be treated mostly as a named value.

    0 讨论(0)
提交回复
热议问题