枚举与function的方法(组合类/枚举)
我可能会错过这里的一些观点,如果是这样的话,请把这个讨论作为我的问题的一部分来讨论。
这是一个缩短和重新命名的工作代码样本。 GetTicks(..)是一个单独的样本,可以是任何types的function(值> 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; }
这个想法是收集涉及枚举的function,尽可能接近枚举本身。 枚举是原因function。 另外我发现在枚举附近寻找这样的function很容易和自然。 也很容易修改或扩展。
我有的缺点是,我必须说明枚举更明确Something.TypeOf
。 devise可能看起来不规范? 如果这个枚举是在课堂上供内部使用的话,将会适用。
你会怎么做更好? 我尝试了抽象,基础inheritance,部分。 他们似乎都不适用。
C#枚举不能像这样工作。 但是,您可以很容易地实现自己的“固定值集合”
public sealed class Foo { public static readonly Foo FirstValue = new Foo(...); public static readonly Foo SecondValue = new Foo(...); private Foo(...) { } // Add methods here }
碰巧,我得到的一个例子与你的非常相似 – Noda Time中的 DateTimeFieldType
。 有时甚至可能希望使类不被封装,但保留私有构造函数 – 它允许您仅将子类创build为嵌套类 。 非常方便限制inheritance。
缺点是你不能使用开关:(
如果你不介意多写一些,你可以做一个扩展方法来扩展枚举的接口。
例如
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 */ } } }
这可以将“实例”方法添加到您的枚举。 比起大多数人来说,这有点冗长。
请记住,虽然枚举应该被视为主要的命名值。