我创建了一个方法,它接受一个枚举并在一个Dictionary中将其转换,其中每个int与枚举的名称(作为字符串)相关联
// Define like this
public static Dictionary<int, string> getDictionaryFromEnum<T>()
{
List<T> commandList = Enum.GetValues(typeof(T)).Cast<T>().ToList();
Dictionary<int, string> finalList = new Dictionary<int, string>();
foreach (T command in commandList)
{
finalList.Add((int)(object)command, command.ToString());
}
return finalList;
}
(ps。是的,我有一个双重演员,但该应用程序是一个非常便宜和肮脏的C#-enum到Javascript-enum转换器)。
这可以像这样轻松使用
private enum _myEnum1 { one = 1001, two = 1002 };
private enum _myEnum2 { one = 2001, two = 2002 };
// ...
var a = getDictionaryFromEnum<_myEnum1>();
var b = getDictionaryFromEnum<_myEnum2>();
现在,我想知道是否可以创建一个枚举列表,用于一系列调用迭代我的调用。
这是原来的问题:[为什么我不能称之为?]
我该怎样做才能创建像这样的电话?
List<Type> enumsToConvertList = new List<Type>();
enumsToConvertList.Add(typeof(_myEnum1));
enumsToConvertList.Add(typeof(_myEnum2));
// this'll be a loop
var a = getDictionaryFromEnum<enumsToConvertList.ElementAt(0)>();
答案 0 :(得分:6)
您无法在运行时指定通用参数类型(嗯,没有反射)。因此,只需创建非泛型方法,该方法接受Type
类型的参数:
public static Dictionary<int, string> getDictionaryFromEnum(Type enumType)
{
return Enum.GetValues(enumType).Cast<object>()
.ToDictionary(x => (int)x, x => x.ToString());
}
用法:
List<Type> enumsToConvertList = new List<Type>();
enumsToConvertList.Add(typeof(_myEnum1));
enumsToConvertList.Add(typeof(_myEnum2));
var a = getDictionaryFromEnum(enumsToConvertList[0]);
答案 1 :(得分:2)
为什么我不能这称呼?
在这种情况下,您传入System.Type
,这与通用说明符不同,后者是编译时值。
答案 2 :(得分:0)
简单来说,必须在编译时知道泛型的类型参数。
您正尝试将运行时System.Type
对象作为泛型类型说明符传递,这是不可能的。
至于你想要实现的目标,你的方法实际上并不需要是通用的,因为你总是返回Dictionary<int, string>
。尝试将Type
作为参数传递给方法,如@lazyberezovsky所示。
答案 3 :(得分:0)
稍后转换为该类型:
List<Type> enumsToConvertList = new List<Type>();
enumsToConvertList.Add(_myEnum1);
var a = getDictionaryFromEnum<typeof(enumsToConvertList.ElementAt(0))>();
答案 4 :(得分:0)
这是另一种方法,它将Enum作为泛型并返回所有成员的字典
public static Dictionary<int, string> ToDictionary<T>()
{
var type = typeof (T);
if (!type.IsEnum) throw new ArgumentException("Only Enum types allowed");
return Enum.GetValues(type).Cast<Enum>().ToDictionary(value => (int) Enum.Parse(type, value.ToString()), value => value.ToString());
}