Как мне передать перечисление в этом контексте - PullRequest
2 голосов
/ 02 октября 2011

Я хочу изменить написанную ниже функцию, чтобы она принимала Enum (в данном случае MyColors) в качестве аргумента, чтобы я мог использовать эту функцию в любом подходящем смежном Enum.Все, что я пробовал до сих пор, провалилось, поэтому я застрял.

    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 ]

3 голосов
/ 02 октября 2011

Должно работать следующее:

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;
}

Поскольку метод теперь является универсальным, его необходимо вызывать с аргументом типа enum, например:

GetNext<MyColors>("Red")
0 голосов
/ 02 октября 2011

Это даст вам следующее значение в enum или 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); 

Функция GetValues ​​для silverlight

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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...