使用Type变量</t>强制转换<t>()

时间:2011-12-15 18:45:43

标签: c# linq casting enums

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

这是我的代码:

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

(我在此代码段中声明enumType但实际上我的方法签名中声明为MyMethod(Type enumType)。我没有显示我的方法签名,因为这需要引入一些 struct 我正在使用,这与此处的问题无关)

问题是这段代码无法编译,我在Cast<enumType>().行上遇到以下错误:

  

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

我不明白enumType怎么可能不知道,我刚刚在前一行宣布过它!

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

我在这里遗漏了什么吗?一些LINQ玩弄技巧吗?

6 个答案:

答案 0 :(得分:5)

这应该是:

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

问题是Cast<T>()电话。泛型方法类型需要实际的类型规范(SomeEnum),而不是System.TypeenumType)。

答案 1 :(得分:5)

泛型不允许您传递变量的实例,您需要使用Cast<SomeEnum>(),或者使用此代码所属的方法,并使用类似Cast<T>()的内容。

答案 2 :(得分:2)

试试这个:

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

答案 3 :(得分:1)

尝试更改

Cast<enumType>()

Cast<SomeEnum>()

答案 4 :(得分:1)

这是我所拥有的

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

答案 5 :(得分:0)

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 });