提供的类型必须是枚举

时间:2019-02-25 10:12:47

标签: c# enums

我有以下设置

public enum Color
{
      Red,
      Green,
      Blue
}

public void ToCombo<T>(this T enumType)
{
    var v = Enum.GetValues(enumType.GetType()); <-- Exception raised
}

在调用扩展方法时

typeof(Color).ToCombo();

我收到以下错误。

System.ArgumentException: 'Type provided must be an Enum.
Parameter name: enumType'

我在这里做什么错了?

4 个答案:

答案 0 :(得分:1)

您不是将扩展名称为$('#start-photo-book').on('click', function() { var book = []; $.each( $("#photo-book").children(), function( key, value ) { book.push({ content : $( value ).clone(), type : 'html' }) }); $.fancybox.open( book, { loop : false, smallBtn : false }); }); 值,而是将其称为Enum值。当使用泛型类型参数时,您不使用类型(对此使用反射),而是使用该类型的值 。自

Type的类型为Color.Blue

Color的类型为typeof(Color)

当您这样调用时,您的代码可以正常工作:

Type

Color.Blue.ToCombo()

或者您直接通过使用类型来使用反射...

default(Color).ToCombo()

并保持您的初始通话。

答案 1 :(得分:-1)

typeof(Color).ToCombo()中,您获得的扩展方法不是Color类型的,这根本不可能,但是您正在扩展Type类型,因此您尝试调用

Enum.GetValues()位于Type而非Enum上,因此它最终将在运行时死亡。

您必须添加对通用规范的检查,仅允许枚举类型,并在下面修复代码:

    class Program
    {
        static void Main(string[] args)
        {
            var results = ToCombo(typeof(Color));
            foreach (var item in results)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine("Hello World!");
        }

        public static IEnumerable<string> ToCombo(Type type)
        {
            if (type.IsEnum)
            {
                return ((Color[])Enum.GetValues(type)).Select(_=>_.ToString());
            }
            return Array.Empty<string>();
        }
    }

答案 2 :(得分:-1)

我建议考虑采用以下方法。

我还假设该方法的重点是返回要插入到combo中的值,因此我已从void更改为{ {1}}。

List<T>

请注意,我明确地使用扩展方法,因为扩展方法的方法往往比较冗长(因为您需要在扩展名的using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApp4 { public enum Color { Red, Green, Blue } public static class EnumCombo { public static List<T> ToCombo<T>() { return Enum.GetValues(typeof(T)).Cast<T>().ToList(); } } internal class Program { private static void Main(string[] args) { var results = EnumCombo.ToCombo<Color>(); Console.ReadLine(); } } } 上进行调用枚举,但仍将Type类型作为enum参数传递,否则您需要传递实际的T值-在我看来,这两个值都不太清楚)。

答案 3 :(得分:-1)

您的扩展方式需要更改为:

  public static void ToCombo<T>(this T type)
    {
        if (typeof(T).BaseType != typeof(Enum))
        {
            throw new InvalidCastException();
        }
        var arrValues = Enum.GetValues(typeof(T));
    }