如何将变量指向Enum?

时间:2011-08-14 14:04:03

标签: c# enums

例如,我想在下面的代码中替换Dogs for Cats(在这个例子中,字符串“蓬松”将始终从其他地方检索,并从相同的Enum设置,在本例中将是't')。

代码btw不起作用,但你可以看到我想要做的事情。

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(字符串“蓬松”将相应地不同)。因此,在这个例子中,我可以返回“蓬松”作为枚举,然后获得序列中的下一个项目,如果需要的话,“毛茸茸”。如果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 个答案:

答案 0 :(得分:2)

我将为您提供一些使用泛型的示例,为您提供更多选择。

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

编辑: 对不起,您可以这样调用第二种方法,当然处理例外:

var x = Parse< Cats >( testValue );

答案 1 :(得分:0)

最后两行可以替换为

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

如果您还想避免使用var,这可以替代IAbstract的完美答案。

答案 2 :(得分:0)