创建枚举列表并将其传递给方法

时间:2013-02-04 16:44:57

标签: c# generics enums

我创建了一个方法,它接受一个枚举并在一个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)>();

5 个答案:

答案 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());
    }