如何获取枚举的所有值?

27

我希望创建一个方法,该方法接收一个Enum类型的参数,并返回其所有成员的数组。如何创建这样的函数?

例如,我有以下两个枚举:

public enum Family
{ 
   Brother,
   Sister,
   Father
}

public enum CarType
{ 
   Volkswagen,
   Ferrari,
   BMW
}

如何创建一个名为GetEnumList的函数,使其返回以下结果:

  1. 对于第一种情况,返回{Family.Brother, Family.Sister, Family.Father}
  2. 对于第二种情况,返回{CarType.Volkswagen, CarType.Ferrari, CarType.BMW}

我尝试了以下代码:

private static List<T> GetEnumList<T>()
{
    var enumList = Enum.GetValues(typeof(T))
        .Cast<T>().ToList();
    return enumList;
}

但我遇到了一个 InvalidOperationException

System.InvalidOperationException:无法对包含泛型参数的类型或方法执行后期绑定操作。 at System.Reflection.RuntimeMethodInfo.ThrowNoInvokeException() at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)

编辑:上述代码运行良好--我遇到异常的原因是性能分析器导致了这个错误。感谢大家提供的解决方案。


它对我来说运行良好 - 你能发布调用代码吗? - RobS
1
是的,它运行良好 - 我发现我的分析器实际上导致了一个错误,因此导致了异常。 - Graviton
4个回答

29
以下是完整代码:
    public enum Family
    {
        Brother,
        Sister,
        Father
    }

    public enum CarType
    {
        Volkswagen,
        Ferrari,
        BMW
    }


    static void Main(string[] args)
    {
        Console.WriteLine(GetEnumList<Family>());
        Console.WriteLine(GetEnumList<Family>().First());
        Console.ReadKey();
    }

    private static List<T> GetEnumList<T>()
    {
        T[] array = (T[])Enum.GetValues(typeof(T));
        List<T> list = new List<T>(array);
        return list;
    }

以下有什么区别: (1)Enum.GetValues(typeof(theEnum)); // 返回在枚举中定义的纯枚举 (2)int i = (int)theEnum.item; // 如果未设置,则从零开始显示指示器数字,如果已设置,则显示它们的值 (3)Enum.GetNames(typeof(theEnum)); // 返回枚举名称作为字符串 - zokaee hamid

19

与其他答案相同,但更新为现代C#:

public static List<TEnum> GetEnumList<TEnum>() where TEnum : Enum 
    => ((TEnum[])Enum.GetValues(typeof(TEnum))).ToList();

6
“现代”很短暂。.Net Core 5有Enum.GetValues<TEnum>() - Gert Arnold

16
(Family[])Enum.GetValues(typeof(Family))

谢谢,但我想要一个通用的方法,它接受枚举类型并返回相应的列表--但是一个特定的转换函数。 - Graviton

8
像这样吗?
private static List<string> GetEnumList<T>()
{
    return Enum.GetNames( typeof( T ) )
           .Select(s => typeof(T).Name + "." + s).ToList();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接