循环各种枚举的函数
Function that does loop over various enum
例如,让我们枚举并遍历它
enum Main_menu { NewGame, Options, AboutAuthor, Exit }
static void Main(string[] args)
{
int k = 0;
foreach (Main_menu item in Enum.GetValues(typeof(Main_menu)))
{
Console.Write($"{k} ");
Console.Write(item);
Console.WriteLine();
k++;
}
Console.ReadLine();
}
这个枚举代表非常简单的类型菜单,在我工作的程序中,我不得不多次使用这种菜单,所以我更喜欢将它添加到一个单独的函数中,通过针对代码的一部分循环并使用热键 Ctrl+Dot 我收到以下信息:
enum Main_menu { NewGame, Options, AboutAuthor, Exit }
static void Main(string[] args)
{
int k = 0;
k = LoopOverEnum(k);
Console.ReadLine();
}
private static int LoopOverEnum(int k)
{
foreach (Main_menu item in Enum.GetValues(typeof(Main_menu)))
{
Console.Write($"{k} ");
Console.Write(item);
Console.WriteLine();
k++;
}
return k;
}
}
现在,我想添加枚举 Main_menu 作为变量,因此,我将能够对每个定义的枚举应用此循环,我尝试按如下方式进行:
namespace ConsoleApp11
{
class Program
{
enum Main_menu { NewGame, Options, AboutAuthor, Exit }
static void Main(string[] args)
{
int k = 0;
k = LoopOverEnum(k, Main_menu);
Console.ReadLine();
}
private static int LoopOverEnum(int k, enum Main_menu)
{
foreach (Main_menu item in Enum.GetValues(typeof(Main_menu)))
{
Console.Write($"{k} ");
Console.Write(item);
Console.WriteLine();
k++;
}
return k;
}
}
}
但是该函数的代码因各种错误而变成全红色。问题是:
1) 如何编写遍历枚举的函数,因为枚举是可变的?
2) 如何在枚举项的定义中使用 space ?
这是循环枚举的通用方法:
static void IterateEnum<T>(T enumSource)
{
foreach(var item in Enum.GetValues(typeof(T)))
{
Console.WriteLine(item);
}
}
public static IEnumerable<T> GetValues<T>() => Enum.GetValues(typeof(T)).Cast<T>();
用法:
foreach (Main_menu item in GetValues<Main_menu>())
MessageBox.Show(item.ToString());
k
不应该是 Main
中的局部变量。应该是LoopOverEnum
.
中的局部变量
有两种方法可以将类型传递给方法。您对 LoopOverEnum(int k, enum Main_menu)
的尝试是一个很好的尝试,但遗憾的是它不是有效的 C#。
您可以:
使用泛型类型参数:
public static void LoopOverEnum<T>()
int k = 0;
foreach (T item in Enum.GetValues(typeof(T)))
{
Console.Write($"{k} ");
Console.Write(item);
Console.WriteLine();
k++;
}
}
// usage:
LoopOverEnum<Main_menu>()
使用类型为Type
的参数:
public static void LoopOverEnum(Type type)
int k = 0;
foreach (var item in Enum.GetValues(type))
{
Console.Write($"{k} ");
Console.Write(item);
Console.WriteLine();
k++;
}
}
// usage:
LoopOverEnum(typeof(Main_menu))
迭代任何类型的枚举并且
在枚举值中包含空格
您可以使用 description 属性,如下所示。您可以使用以下方法获取 descriptionAttribute 中提到的值。方法是通用的,因此可以与任何枚举一起使用。
using System.ComponentModel;
public enum MyEnum
{
[Description("value 1")]
Value1,
[Description("value 2")]
Value2,
[Description("value 3")]
Value3
}
public static string GetDescription<T>( T e)
{
if (e is Enum)
{
Type type = e.GetType();
Array values = System.Enum.GetValues(type);
foreach (int val in values)
{
if (val == e.ToInt32(CultureInfo.InvariantCulture))
{
var memInfo = type.GetMember(type.GetEnumName(val));
var descriptionAttribute = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault() as DescriptionAttribute;
if (descriptionAttribute != null)
{
return descriptionAttribute.Description;
}
}
}
}
return null; // could also return string.Empty
}
例如,让我们枚举并遍历它
enum Main_menu { NewGame, Options, AboutAuthor, Exit }
static void Main(string[] args)
{
int k = 0;
foreach (Main_menu item in Enum.GetValues(typeof(Main_menu)))
{
Console.Write($"{k} ");
Console.Write(item);
Console.WriteLine();
k++;
}
Console.ReadLine();
}
这个枚举代表非常简单的类型菜单,在我工作的程序中,我不得不多次使用这种菜单,所以我更喜欢将它添加到一个单独的函数中,通过针对代码的一部分循环并使用热键 Ctrl+Dot 我收到以下信息:
enum Main_menu { NewGame, Options, AboutAuthor, Exit }
static void Main(string[] args)
{
int k = 0;
k = LoopOverEnum(k);
Console.ReadLine();
}
private static int LoopOverEnum(int k)
{
foreach (Main_menu item in Enum.GetValues(typeof(Main_menu)))
{
Console.Write($"{k} ");
Console.Write(item);
Console.WriteLine();
k++;
}
return k;
}
}
现在,我想添加枚举 Main_menu 作为变量,因此,我将能够对每个定义的枚举应用此循环,我尝试按如下方式进行:
namespace ConsoleApp11
{
class Program
{
enum Main_menu { NewGame, Options, AboutAuthor, Exit }
static void Main(string[] args)
{
int k = 0;
k = LoopOverEnum(k, Main_menu);
Console.ReadLine();
}
private static int LoopOverEnum(int k, enum Main_menu)
{
foreach (Main_menu item in Enum.GetValues(typeof(Main_menu)))
{
Console.Write($"{k} ");
Console.Write(item);
Console.WriteLine();
k++;
}
return k;
}
}
}
但是该函数的代码因各种错误而变成全红色。问题是:
1) 如何编写遍历枚举的函数,因为枚举是可变的?
2) 如何在枚举项的定义中使用 space ?
这是循环枚举的通用方法:
static void IterateEnum<T>(T enumSource)
{
foreach(var item in Enum.GetValues(typeof(T)))
{
Console.WriteLine(item);
}
}
public static IEnumerable<T> GetValues<T>() => Enum.GetValues(typeof(T)).Cast<T>();
用法:
foreach (Main_menu item in GetValues<Main_menu>())
MessageBox.Show(item.ToString());
k
不应该是 Main
中的局部变量。应该是LoopOverEnum
.
有两种方法可以将类型传递给方法。您对 LoopOverEnum(int k, enum Main_menu)
的尝试是一个很好的尝试,但遗憾的是它不是有效的 C#。
您可以:
使用泛型类型参数:
public static void LoopOverEnum<T>() int k = 0; foreach (T item in Enum.GetValues(typeof(T))) { Console.Write($"{k} "); Console.Write(item); Console.WriteLine(); k++; } } // usage: LoopOverEnum<Main_menu>()
使用类型为
Type
的参数:public static void LoopOverEnum(Type type) int k = 0; foreach (var item in Enum.GetValues(type)) { Console.Write($"{k} "); Console.Write(item); Console.WriteLine(); k++; } } // usage: LoopOverEnum(typeof(Main_menu))
迭代任何类型的枚举并且 在枚举值中包含空格
您可以使用 description 属性,如下所示。您可以使用以下方法获取 descriptionAttribute 中提到的值。方法是通用的,因此可以与任何枚举一起使用。
using System.ComponentModel;
public enum MyEnum
{
[Description("value 1")]
Value1,
[Description("value 2")]
Value2,
[Description("value 3")]
Value3
}
public static string GetDescription<T>( T e)
{
if (e is Enum)
{
Type type = e.GetType();
Array values = System.Enum.GetValues(type);
foreach (int val in values)
{
if (val == e.ToInt32(CultureInfo.InvariantCulture))
{
var memInfo = type.GetMember(type.GetEnumName(val));
var descriptionAttribute = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault() as DescriptionAttribute;
if (descriptionAttribute != null)
{
return descriptionAttribute.Description;
}
}
}
}
return null; // could also return string.Empty
}