我可能会在这里错过某种观点,如果是这种情况 - 请将该讨论作为我问题的一部分:).
这是一个缩短并重命名的工作代码示例.这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应该主要作为命名值处理.
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)
碰巧,我得到的一个例子与你的非常相似 - DateTimeFieldType在Noda Time.有时您甚至可能希望将类打开,但保留私有构造函数 - 这允许您仅将嵌套类创建为子类.非常方便限制继承.
缺点是你不能使用开关:(