c#:创建一个泛型方法,它可以返回一个枚举,如List

本文关键字:一个 枚举 List string 返回 创建 泛型方法 | 更新日期: 2023-09-27 18:14:16

如何创建一个泛型方法,该方法接收enum类型并以字符串列表的形式返回其值和名称,这样我就可以循环该列表,并且对于每次迭代,我将能够打印每个enum值。例如,考虑下一个pseudo:

enum MyEnum { A=5, B=6, C=8 }
List<string> createEnumStrings(AnyEnum(??))
{
  List<string> listResult;
  
  // ??
  // a code that will generate:
  // listResult[0] = "Value 5 Name A"
  // listResult[1] = "Value 6 Name B"
  // lsitResult[2] = "Value 8 Name C"
  return listResult;
}

再次注意,该方法可以获得任何类型的enum

c#:创建一个泛型方法,它可以返回一个枚举,如List<string>

public List<string> GetValues(Type enumType)
{
    if(!typeof(Enum).IsAssignableFrom(enumType))
        throw new ArgumentException("enumType should describe enum");
    var names = Enum.GetNames(enumType).Cast<object>();
    var values = Enum.GetValues(enumType).Cast<int>();
    return names.Zip(values, (name, value) => string.Format("Value {0} Name {1}", value, name))
                .ToList();     
}

现在如果你选择

GetValues(typeof(MyEnum)).ForEach(Console.WriteLine);

将打印:

Value 5 Name A
Value 6 Name B
Value 8 Name C

Non-LINQ版本:

public List<string> GetValues(Type enumType)
{   
    if(!typeof(Enum).IsAssignableFrom(enumType))
        throw new ArgumentException("enumType should describe enum");
    Array names = Enum.GetNames(enumType);
    Array values = Enum.GetValues(enumType);
    List<string> result = new List<string>(capacity:names.Length);
    for (int i = 0; i < names.Length; i++)
    {
        result.Add(string.Format("Value {0} Name {1}", 
                                (int)values.GetValue(i), names.GetValue(i)));
    }
    return result;
}