Как мне указать переменную на Enum? - PullRequest
1 голос
/ 14 августа 2011

Например, я хотел бы заменить Dogs на Cats в приведенном ниже коде (строка «пушистый» в этом случае всегда будет извлекаться из другого места и устанавливаться из того же Enum, который будет «t» в этом примере).

Код, кстати, не работает, но вы можете видеть, что я пытаюсь сделать.

private enum Cats { Fluffy, Furry, Bald };
private enum Dogs { Big, Fat, Ugly };

sometype CurrentEnum = Cats;

var x = Enum.Parse(typeof(CurrentEnum), "fluffy", true); 

ОБНОВЛЕНИЕ 1

Из ответовЯ не думаю, что ясно дал понять, чего я пытаюсь достичь, поэтому я внес некоторые изменения.

Иногда CurrentEnum будет указывать на Cats, иногда на Dogs (строка «пушистая» будетотличается соответственно).Следовательно, в этом примере я могу вернуть «пушистый» как Enum, а затем получить следующий элемент в последовательности, «Furry», если это будет необходимо.И если CurrentEnum указывает на Dogs и строка "Fat", я могу добраться до Dogs.Ugly.Имеет смысл?

ОБНОВЛЕНИЕ 2

Вот где я нахожусь:

class Program
{
    enum Cats { Fluffy, Furry, Bald };
    enum Dogs { Big, Fat, Ugly };

    static Type CurrentEnum;

    static void Main(string[] args)
    {
        CurrentEnum = typeof(Cats); // set elsewhere in program

        Int32 i = (Int32)Enum.Parse(CurrentEnum, "fluffy", true);
        Array a = CurrentEnum.GetEnumValues();

        Console.WriteLine(a.GetValue(i + 1)); // next in sequence
    }
}

Обратите внимание, что CurrentEnum можно установить в другом месте программы,но извлекается для определения следующего значения в перечислении при необходимости.Я нахожу немного странным, что мне нужно вывести мое перечисление в массив, прежде чем я смогу получить доступ к значениям.

ОБНОВЛЕНИЕ 3

Теперь я убедился, чтоэто лучшее решение:

class Program
{
    enum Cats { Fluffy, Furry, Bald };
    enum Dogs { Big, Fat, Ugly };

    static Type CurrentEnum = typeof(Cats);

    static void Main(string[] args)
    {
        Int32 i = (Int32)Enum.Parse(CurrentEnum, "Bald", true);           
        i = i == CurrentEnum.GetEnumValues().Length - 1 ? 0 : i++;
        String nextValue = CurrentEnum.GetEnumValues().GetValue(i).ToString();

        Console.WriteLine(nextValue);
        Console.ReadKey();
    }
}

Ответы [ 3 ]

2 голосов
/ 14 августа 2011

Я приведу небольшой пример с использованием обобщений, предоставлю вам больше выбора.

class Program
{
    private enum Cats { Fluffy, Furry, Bald };
    private enum Dogs { Big, Fat, Ugly };

    static void Main ( string [] args )
    {
        var testValue = "Fluffy";

        Cats? tempCat;
        Dogs? tempDog;

       if(  TryParse( testValue, false, out tempCat ) )
           Console.WriteLine ( "'{0}' was parsed to a cat", testValue );

        testValue = "Ugly";

        if ( TryParse ( testValue, false, out tempDog ) )
            Console.WriteLine ( "'{0}' was parsed to a dog", testValue );

        Console.ReadKey ( );

    }

    public static bool TryParse<T> ( string value, bool ignoreCase, out T? result ) where T : struct, IComparable, IFormattable, IConvertible
    {
        result = null;
        if ( !Enum.IsDefined ( typeof ( T ), value ) )
            return false;

        result = ( T )Enum.Parse ( typeof ( T ), value, ignoreCase );
        return true;
    }
}

Вам не нужно идти по пути TryParse, если вы хотите, чтобы он был более динамичным.Вы можете изменить его так, чтобы он возвращал T и выдавать исключения, если переданная строка не определена или если T не является перечислением, например

public static T Parse<T> ( string value, bool ignoreCase = false) where T : struct, IComparable, IFormattable, IConvertible
    {
        if ( !typeof ( T ).IsEnum )
            throw new ArgumentException( string.Format( "The type ({0}) must be an enum", typeof ( T ).FullName ) );


        if ( !Enum.IsDefined ( typeof ( T ), value ) )
            throw new ArgumentException( string.Format( "{0} is not defined for the enum {1}", value, typeof ( T ).FullName ) );

        return ( T )Enum.Parse ( typeof ( T ), value, ignoreCase );
    }

EDIT: Извините, и вы бы вызвали 2-й метод как таковойОбработка исключений курса:

var x = Parse< Cats >( testValue );
0 голосов
/ 14 августа 2011

Попробуйте этот код:

class Program
{
    enum Cats { Fluffy, Furry, Bald };
    enum Dogs { Big, Fat, Ugly };

    static void Main(string[] args)
    {
        string name = "Fluffy";
        Type currentEnum = typeof(Cats);

        if(currentEnum.Equals(typeof(Cats)))
        {
            Cats cat = (Cats)Enum.Parse(typeof(Cats), name);
            Console.WriteLine("old " + cat);                        // Prints "old Fluffy"
            Console.WriteLine("new " + (cat + 1));                  // Prints "new Furry"  // TODO: Add error check for the + 1
        }
        else if (currentEnum.Equals(typeof(Dogs)))
        {
            Dogs dog = (Dogs)Enum.Parse(typeof(Cats), name);
            Console.WriteLine("old " + dog);
            Console.WriteLine("new " + (dog + 1));
        }

        Console.ReadKey();
    }
}
0 голосов
/ 14 августа 2011

Последние две строки можно заменить на

Cats x = (Cats)Enum.Parse(typeof(Cats), "fluffy", true);

Это альтернатива совершенно хорошему ответу IAbstract, если вы также хотите избежать использования var.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...