我有以下设置
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'
我在这里做什么错了?
答案 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));
}