如何在此上下文中传递枚举

时间:2011-10-02 17:32:03

标签: c# silverlight enums

我想更改我编写的下面的函数,以便它将Enum(在此实例中为MyColors)作为参数,以便我可以在任何合适的连续枚举上使用该函数。到目前为止我尝试的所有东西都失败了所以我被卡住了。

    private enum MyColors { Red, Green, Blue }

    private String GetNext(String colorName)
    {
        MyColors colorValue;
        String colorNameOut = String.Empty;

        if (Enum.TryParse(colorName, out colorValue))
        {
            MyColors initial = colorValue, next = colorValue;

            for (int i = ((Int32)initial) + 1; i < 10; i++)
            {
                if (Enum.IsDefined(typeof(MyColors), i))
                {
                    next = (MyColors)i;
                    break;
                }
                else
                {
                    next = (MyColors)0;
                }
            }
            colorNameOut = next.ToString();
        }
        return colorNameOut;
    }

2 个答案:

答案 0 :(得分:3)

以下应该有效:

private static String GetNext<T>(String colorName) where T : struct
{
     // Verify that T is actually an enum type
     if (!typeof(T).IsEnum)
        throw new ArgumentException("Type argument must be an enum type");

     T colorValue;
     String colorNameOut = String.Empty;

     if (Enum.TryParse<T>(colorName, out colorValue))
     {
        T initial = colorValue, next = colorValue;

        for (int i = (Convert.ToInt32(initial)) + 1; i < 10; i++)
        {
           if (Enum.IsDefined(typeof(T), i))
           {
              next = (T)Enum.ToObject(typeof(T), i);
              break;
           }
           else
           {
              next = (T)Enum.ToObject(typeof(T), 0);
           }
        }
        colorNameOut = next.ToString();
     }
     return colorNameOut;
}

由于该方法现在是通用的,因此必须使用枚举类型的类型参数调用,如:

GetNext<MyColors>("Red")

答案 1 :(得分:0)

如果输入是最后一个值

,这将为您提供枚举中的下一个值或null
public TEnum? GetNext<TEnum>(TEnum enm) where TEnum : struct
{
    var values = Enum.GetValues(enm.GetType());
    var index = Array.IndexOf(values, enm) + 1;
    return index < values.Length ? (TEnum?)values.GetValue(index) : null;
}

用法

var nextColor = GetNext(MyColors.Red); 

Silverlight的GetValues函数

public static object[] GetValues(Type enumType)
    {
        if (!enumType.IsEnum)
        {
            throw new ArgumentException("Type '" + enumType.Name + "' is not an enum");
        }

        List<object> values = new List<object>();

        var fields = from field in enumType.GetFields()
                     where field.IsLiteral
                     select field;

        foreach (FieldInfo field in fields)
        {
            object value = field.GetValue(enumType);
            values.Add(value);
        }

        return values.ToArray();
    }