您可以将其简化并概括:
static Enum GetNextValue(Enum e){
Array all = Enum.GetValues(e.GetType());
int i = Array.IndexOf(all, e);
if(i < 0)
throw new InvalidEnumArgumentException();
if(i == all.Length - 1)
throw new ArgumentException("No more values", "e");
return (Enum)all.GetValue(i + 1);
}
编辑:
请注意,如果您的枚举包含重复值(同义词条目),则使用此方法(或此处列出的任何其他技术)将会失败,给定其中一个值。例如:
enum BRUSHSTYLE{
SOLID = 0,
HOLLOW = 1,
NULL = 1,
HATCHED = 2,
PATTERN = 3,
DIBPATTERN = 5,
DIBPATTERNPT = 6,
PATTERN8X8 = 7,
DIBPATTERN8X8 = 8
}
如果给定的是BRUSHSTYLE.NULL
或者BRUSHSTYLE.HOLLOW
,那么返回值将会是BRUSHSTYLE.HOLLOW
。
<leppie>
Update: a generics version:
static T GetNextValue<T>(T e)
{
T[] all = (T[]) Enum.GetValues(typeof(T));
int i = Array.IndexOf(all, e);
if (i < 0)
throw new InvalidEnumArgumentException();
if (i == all.Length - 1)
throw new ArgumentException("No more values", "e");
return all[i + 1];
}
</leppie>
@leppie:
你的通用版本允许意外传递非枚举值,这只能在运行时捕获。我最初是将其编写为通用版本,但当编译器拒绝 where T : Enum
时,我将其删除,并意识到我并没有从通用性中获得太多好处。唯一的真正缺点是你必须将结果强制转换回你特定的枚举类型。