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));
}