Cast <T> () with a type variable
I am trying to make a method to list any enum by returning a list containing each name and constant value.
Here is my code:
Type enumType = typeof(SomeEnum); var enumConstants = Enum.GetValues(enumType). Cast<enumType>(). Select(x => new { Value = (int) x, Name = x.ToString() });
(I declare enumType
in this snippet, but in fact it is declared in my method signature as MyMethod(Type enumType)
. I do not show my method signature, because for this it will be necessary to enter some structure that I use does not apply to the problem here )
The problem is that this code does not compile, and I get Cast<enumType>().
in the line Cast<enumType>().
following error:
The type or namespace name 'enumType' cannot be found (are you missing the using directive or assembly references?)
I do not understand how enumType
unknown, I just declared it in the previous line!
Notice that in the line is Enum.GetValues(enumType).
no errors were noted.
Am I missing something? Are some LINQ tricks?
Generics do not allow you to pass an instance of a variable, you need to either use Cast<SomeEnum>()
, or make a method in which this code is shared, and use something like Cast<T>()
.
It should be:
Type enumType = typeof(SomeEnum); var enumConstants = Enum.GetValues(enumType). Cast<SomeEnum>(). Select(x => new { Value = (int) x, Name = x.ToString() });
The problem is calling Cast<T>()
. A generic method type requires the actual type specification ( SomeEnum
), not System.Type
( enumType
).
Try the following:
Type enumType = typeof(SqlDbType); var enumConstants = Enum.GetValues(enumType). Cast<Enum>(). Select(x => new { Value = Convert.ToInt32(x), Name = x.ToString() });
that's what i
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() }); } } }
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]); }
Or in a more concise way:
var result = Enum.GetValues(typeof(MyEnum)) .Cast<MyEnum>() .Select(x => new { Name = Enum.GetName(typeof(MyEnum), x), Value = (int)x });