6

我创建了一个方法,它接受一个枚举并将其转换为字典,其中每个 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)>();
4

5 回答 5

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]);
于 2013-02-04T16:50:56.440 回答
2

为什么我不能调用这个?

在这种情况下,您将传入System.Type,这与通用说明符不同,后者是编译时值。

于 2013-02-04T16:50:03.887 回答
1

这是另一种方法,它将 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());
    }
于 2017-03-23T15:11:21.083 回答
0

简单来说,泛型的类型参数必须在编译时知道。

您试图将运行时System.Type 对象作为泛型类型说明符传递,这是不可能的。


至于您要完成的工作,您的方法实际上不需要是通用的,因为您总是返回一个Dictionary<int, string>. 正如@lazyberezovsky 演示的那样,尝试将Type作为参数传递给方法。

于 2013-02-04T16:49:43.040 回答
0

稍后转换为类型:

List<Type> enumsToConvertList = new List<Type>();
enumsToConvertList.Add(_myEnum1);
var a = getDictionaryFromEnum<typeof(enumsToConvertList.ElementAt(0))>();
于 2013-02-04T16:57:02.000 回答