2011-12-15 8 views
7

Estoy tratando de hacer un método para enumerar cualquier enumeración, devolviendo una lista que contiene cada nombre y valor constante.Cast <T>() con una variable de tipo

Aquí está mi código:.

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

(Declaro enumType en este fragmento, pero es de hecho declarada en mi firma método MyMethod(Type enumType) No soy mostrando mi método de firma, ya que requeriría introducir alguna estructura estoy usando, lo que no es relevante para el problema aquí)

el problema es que este código no se compila y yo estoy recibiendo en la línea de la siguiente Cast<enumType>(). er ROR:

The type or namespace name 'enumType' could not be found (are you missing a using directive or an assembly reference?)

No entiendo cómo puede ser desconocida enumType, sólo declaró que en la línea anterior!

Tenga en cuenta que en la línea Enum.GetValues(enumType)., no hay error marcado.

Me estoy perdiendo algo aquí? ¿Hay algunos trucos LINQ jugando?

+1

parámetros de tipo genérico debe estar 't', no' typeof (T) '. –

Respuesta

5

Los genéricos no le permiten pasar una instancia de una variable, necesitará usar Cast<SomeEnum>(), o hacer el método donde este código es genérico, y usar algo como Cast<T>().

5

Esto debería ser:

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

El problema es la llamada Cast<T>(). El tipo de método genérico necesita la especificación actual tipo (SomeEnum), no una System.Type (enumType).

+1

No puedo hacer '' moldeada por diseño, porque no sé 'SomeEnum' en mi método. Mi método será llamado como 'GetEnumValues ​​(typeof (SomeEnum))'. – Otiel

1

intente cambiar

Cast<enumType>() 

a

Cast<SomeEnum>() 
+1

No se puede hacer eso. El objetivo de mi método es * no * saber qué es * enum *. Mi método será llamado como 'GetEnumValues ​​(typeof (SomeEnum))'. Debería haber dejado eso más claro en la pregunta :) – Otiel

2

Prueba esto:

Type enumType = typeof(SqlDbType); 
    var enumConstants = 
     Enum.GetValues(enumType). 
      Cast<Enum>(). 
      Select(x => new { Value = Convert.ToInt32(x), Name = x.ToString() }); 
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]); 
} 

O de una manera más concisa:

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

aquí es lo que tengo

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