0

在下面的存根中,如何将 (MyEnum) 作为参数传入,以便可以将此过程与任何枚举一起使用?

public static Enum Proc(this Enum e)
{
Int32 i = (Int32)(MyEnum)e;
...

这是我想出的可行的解决方案:

public static Enum Next(this Enum e, Type eT)
{
  Int32 i = (Int32)(Object)e;   
  return (Enum)Enum.Parse(eT, Enum.GetName(eT, Enum.GetName(eT, ++i) == null? i = 0 : i));  
}

这个解决方案并不理想,因为我必须这样做才能获得下一个值:

MyEnum e = (MyEnum)e.Next(typeof(MyEnum));

我宁愿做

MyEnum e = e.Next(typeof(MyEnum));

甚至更好:

MyEnum e = e.Next();

任何能提供简单解决方案的人都能明白这一点。

此外,我上面编写的代码在 LinqPad 中运行良好,但只能在 WP7 中编译,然后在运行时抛出异常(InvalidProgramException)。

4

2 回答 2

1

编辑:我更新了这个以返回列表中的下一个枚举,强类型,不管枚举值的编号可能是什么。我能够在 .NET 4 下编译和运行它,并且没有在 WP7 上尝试过,但我认为我没有使用 SL/WP7 中丢失/禁用的任何东西。

public static T Next<T>(this T e) where T : struct
{
    var t = typeof(T);
    if (!t.IsEnum) throw new ArgumentException("T must be an enumerated type");
    if (!Enum.IsDefined(t, e)) throw new ArgumentException();
    var intValue = (int)t.GetField(e.ToString()).GetValue(null);
    var enumValues = t.GetFields(BindingFlags.Public | BindingFlags.Static).Select(x => x.GetValue(null));
    var next = (T?)enumValues.Where(x => (int)x > intValue).Min();
    if (next.HasValue)
        return next.Value;
    else
        return (T)enumValues.Min();
}

它可以简单地使用:

var nextE = e.Next();
于 2012-06-23T16:35:16.783 回答
1

这是一个循环遍历 any 值的函数enum

static public Enum Cycle(this Enum e)
{
    bool found = false;
    Enum first = null;
    foreach (Enum i in Enum.GetValues(e.GetType()))
    {
        if (first == null)
            first = i;
        if (found)
            return i;
        found = e.Equals(i);
    }
    if (found)
        return first;
    return null;
}

对于没有 的 C# 版本Enum.GetValues,您必须使用这样的方法,该方法仅适用于值从 0 开始并以 1 递增的枚举:

static public Enum Cycle(this Enum e)
{
    var i = ((IConvertible)e).ToInt64(null) + 1;
    var eT = e.GetType();
    var next = Enum.GetName(eT, i);
    return (Enum)Enum.Parse(eT, next ?? Enum.GetName(eT, 0), false);
}

像这样使用它:

var nextEnum = (MyEnum)curEnum.Cycle();
于 2012-06-23T19:13:57.137 回答