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
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 :(
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.