C# 提供的类型必须是枚举

C# 提供的类型必须是枚举,c#,enums,C#,Enums,我有以下设置 public enum Color { Red, Green, Blue } public void ToCombo<T>(this T enumType) { var v = Enum.GetValues(enumType.GetType()); <-- Exception raised } 我得到以下错误 System.ArgumentException: 'Type provided must be an En

我有以下设置

public enum Color
{
      Red,
      Green,
      Blue
}

public void ToCombo<T>(this T enumType)
{
    var v = Enum.GetValues(enumType.GetType()); <-- Exception raised
}
我得到以下错误

System.ArgumentException: 'Type provided must be an Enum.
Parameter name: enumType'
我在这里做错了什么?

typeof(Color).ToCombo()
中,您得到的扩展方法不是针对
Color
类型的,这是不可能的,但是您正在扩展
type
type,所以您试图调用

类型上的
Enum.GetValues()
,而不是
Enum
,因此它最终将在运行时死亡

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

类程序
{
静态void Main(字符串[]参数)
{
var结果=ToCombo(颜色类型);
foreach(结果中的var项目)
{
控制台写入线(项目);
}
控制台。WriteLine(“你好,世界!”);
}
公共静态IEnumerable ToCombo(类型)
{
if(type.IsEnum)
{
返回((Color[])Enum.GetValues(type)).Select(=>ux0.ToString());
}
返回Array.Empty();
}
}

您不是在调用扩展名
Enum
值,而是使用
类型
值。当您使用泛型类型参数时,您不使用类型(您使用反射),而是使用该类型的值。自

Color.Blue
属于
Color

typeof(Color)
属于
类型

当您这样调用代码时,代码将正常工作:

Color.Blue.ToCombo()

或者直接使用类型来使用反射

public void ToCombo(this Type enumType)
{
    var v = Enum.GetValues(enumType);
}

并保留您的初始通话。

我建议您考虑以下方法

我还假设该方法的要点是返回要插入到
组合中的值,因此我将
void
更改为
List

使用系统;
使用System.Collections.Generic;
使用System.Linq;
名称空间控制台EAPP4
{
公共枚举颜色
{
红色
绿色
蓝色
}
公共静态类枚举组合
{
公共静态列表ToCombo()
{
返回Enum.GetValues(typeof(T)).Cast().ToList();
}
}
内部课程计划
{
私有静态void Main(字符串[]args)
{
var results=EnumCombo.ToCombo();
Console.ReadLine();
}
}
}

请注意,我显式地而不是使用扩展方法,因为扩展方法方法往往更详细(因为您需要调用枚举的
Type
,但仍然将
enum
类型作为
T
参数传递,或者您需要传递一个实际的
enum
值,在我看来这两个值都不太清楚)。

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

  public static void ToCombo<T>(this T type)
    {
        if (typeof(T).BaseType != typeof(Enum))
        {
            throw new InvalidCastException();
        }
        var arrValues = Enum.GetValues(typeof(T));
    }
publicstaticvoidtocombo(此T类型)
{
if(typeof(T).BaseType!=typeof(Enum))
{
抛出新的InvalidCastException();
}
var arrValues=Enum.GetValues(typeof(T));
}

(enumType.GetType())
应该是
enumType
。您不必要地调用了
type.GetType()
。因此,您得到的是
type
的类型,而不是枚举的类型。
enumType
已经是
type
enumType。GetType()
将导致
typeof(type)
,而不是
typeof(Color)
此enumType
应更改为
此类型enumType
Enum.GetValues(enumType);
注意调试器或
即时窗口
非常适合处理此类问题。引发异常时,键入
?enumType.GetType()
即时窗口中,您很快就会发现错误。您需要删除作为内部值类型的枚举,不能使用扩展方法进行扩展,因此它不会编译
public void ToCombo(this Type enumType)
{
    var v = Enum.GetValues(enumType);
}
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();
        }
    }
}
  public static void ToCombo<T>(this T type)
    {
        if (typeof(T).BaseType != typeof(Enum))
        {
            throw new InvalidCastException();
        }
        var arrValues = Enum.GetValues(typeof(T));
    }