我想更改我编写的下面的函数,以便它将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;
}
答案 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)
如果输入是最后一个值
,这将为您提供枚举中的下一个值或nullpublic 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();
}