Приведение <T>() с переменной типа - PullRequest
9 голосов
/ 15 декабря 2011

Я пытаюсь создать метод для перечисления любого перечисления , возвращая список, содержащий каждое имя и значение константы.

Вот мой код:

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 ]

5 голосов
/ 15 декабря 2011

Обобщения не позволяют вам передавать экземпляр переменной, вам нужно либо использовать Cast<SomeEnum>(), либо сделать метод, где этот код лежит универсальным, и использовать что-то вроде Cast<T>().

5 голосов
/ 15 декабря 2011

Это должно быть:

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

Проблема в вызове Cast<T>().Универсальному типу метода требуется фактическая спецификация типа (SomeEnum), а не System.Type (enumType).

2 голосов
/ 15 декабря 2011

Попробуйте это:

    Type enumType = typeof(SqlDbType);
    var enumConstants =
        Enum.GetValues(enumType).
             Cast<Enum>().
             Select(x => new { Value = Convert.ToInt32(x), Name = x.ToString() });
1 голос
/ 15 декабря 2011

вот что у меня есть

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() });
        }
    }
}
1 голос
/ 15 декабря 2011

Попробуйте изменить

Cast<enumType>()

до

Cast<SomeEnum>()
0 голосов
/ 15 декабря 2011
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 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...