例如,我想在下面的代码中替换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();
}
}
答案 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)