【问题标题】:Cast<T>() with a Type variable带有类型变量的 Cast<T>()
【发布时间】:2011-12-15 18:45:43
【问题描述】:

我正在尝试创建一种方法来枚举任何 enum,方法是返回一个包含每个常量名称和值的列表。

这是我的代码:

Type enumType = typeof(SomeEnum);
var enumConstants = 
    Enum.GetValues(enumType).
         Cast<enumType>().
         Select(x => new { Value = (int) x, Name = x.ToString() });

(我在这个 sn-p 中声明了enumType,但实际上它在我的方法签名中声明为MyMethod(Type enumType)。我没有显示我的方法签名,因为这需要引入一些 struct 我正在使用,与这里的问题无关)

问题是这段代码无法编译,我在Cast&lt;enumType&gt;(). 行出现以下错误:

找不到类型或命名空间名称“enumType”(您是否缺少 using 指令或程序集引用?)

我不明白enumType怎么会是未知的,我刚刚在上一行声明了!

请注意,Enum.GetValues(enumType). 行上没有错误标记。

我在这里遗漏了什么吗?是不是有一些 LINQ 耍花招?

【问题讨论】:

  • 泛型类型参数必须是T,而不是typeof(T)

标签: c# linq casting enums


【解决方案1】:

泛型不允许您传递变量的实例,您需要使用Cast&lt;SomeEnum&gt;(),或者使该代码所在的方法具有泛型,并使用类似Cast&lt;T&gt;() 的东西。

【讨论】:

    【解决方案2】:

    这应该是:

    Type enumType = typeof(SomeEnum);
    var enumConstants = 
        Enum.GetValues(enumType).
         Cast<SomeEnum>().
         Select(x => new { Value = (int) x, Name = x.ToString() });
    

    问题在于Cast&lt;T&gt;() 调用。泛型方法类型需要实际的类型规范 (SomeEnum),而不是 System.Type (enumType)。

    【讨论】:

    • 我不能按设计做Cast&lt;SomeEnum&gt;,因为我不知道SomeEnum 在我的方法中。我的方法将被称为GetEnumValues(typeof(SomeEnum))
    【解决方案3】:

    试试这个:

        Type enumType = typeof(SqlDbType);
        var enumConstants =
            Enum.GetValues(enumType).
                 Cast<Enum>().
                 Select(x => new { Value = Convert.ToInt32(x), Name = x.ToString() });
    

    【讨论】:

      【解决方案4】:

      尝试改变

      Cast<enumType>()
      

      Cast<SomeEnum>()
      

      【讨论】:

      • 不能这样做。我的方法的目的是知道什么是enum。我的方法将被称为GetEnumValues(typeof(SomeEnum))。应该在问题中更清楚地说明这一点:)
      【解决方案5】:

      这就是我所拥有的

      namespace SO.Enums
      {
          public enum SomeEnum
          {
              A,
              B,
              C,
              D
          }
      
          class Program
          {
              static void Main(string[] args)
              {
                  Type enumType = typeof(SomeEnum);
                  var enumConstants =
                      Enum.GetValues(enumType).
                           Cast<SomeEnum>().
                           Select(x => new { Value = (int)x, Name = x.ToString() });
              }
          }
      }
      

      【讨论】:

        【解决方案6】:
        string[] names = Enum.GetNames(typeof(MyEnum));
        MyEnum[] values = (MyEnum[])Enum.GetValues(typeof(MyEnum));
        int[] intValues = values.Cast<int>().ToArray();
        for (int i = 0; i < names.Length; i++) {
            Console.WriteLine("{0} = {1}", names[i], intValues[i]);
        }
        

        或者用更简洁的方式:

        var result = Enum.GetValues(typeof(MyEnum))
            .Cast<MyEnum>()
            .Select(x => new { Name = Enum.GetName(typeof(MyEnum), x), Value = (int)x });
        

        【讨论】:

          猜你喜欢
          • 2017-07-16
          • 2012-12-05
          • 1970-01-01
          • 2015-06-24
          • 2013-12-31
          • 1970-01-01
          • 2022-11-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多