【问题标题】:Create list of enums and pass it to a method创建枚举列表并将其传递给方法
【发布时间】:2013-02-04 16:44:57
【问题描述】:

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

【问题讨论】:

  • 因为泛型中使用的类型和System.Types不一样。
  • a 的类型是什么?
  • 因为泛型只支持静态类型。您正在尝试将类型对象放入泛型方法中的类型参数中。尝试用 Type 对象重写 getDictionaryFromEnum
  • 感谢您的建议,对引起的骚动表示抱歉。

标签: c# generics enums


【解决方案1】:

你不能在运行时指定泛型参数类型(好吧,没有反射)。因此,只需创建接受 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]);

【讨论】:

  • 谢谢懒惰,我会接受你的回答。我将从我的简历上的 C# 插槽中删除“高级知识”。
  • @malber 也许你只需要阅读几篇关于泛型和 Linq 的文章,而不是修改你的简历 :)
【解决方案2】:

为什么我不能这样称呼?

在这种情况下,您传入的是 System.Type,它不同于泛型说明符,后者是一个编译时间值。

【讨论】:

    【解决方案3】:

    这是一个替代方法,它将 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());
        }
    

    【讨论】:

      【解决方案4】:

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

      您正在尝试将运行时 System.Typeobject 作为泛型类型说明符传递,这是不可能的。


      至于你想要完成什么,你的方法实际上不需要是通用的,因为你总是返回一个Dictionary&lt;int, string&gt;。尝试将 Type 作为参数传递给方法,正如 @lazyberezovsky 所演示的那样。

      【讨论】:

        【解决方案5】:

        稍后转换为类型:

        List<Type> enumsToConvertList = new List<Type>();
        enumsToConvertList.Add(_myEnum1);
        var a = getDictionaryFromEnum<typeof(enumsToConvertList.ElementAt(0))>();
        

        【讨论】:

          猜你喜欢
          • 2017-02-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多