C #: общий список значений перечисления - PullRequest
2 голосов
/ 31 октября 2011

Есть ли способ создать метод, который получает тип перечисления в качестве параметра и возвращает общий список базового типа перечисления из его значений, независимо от того, является ли базовый тип int \ short byte и т. Д.
Я видел этот ответ Джона Скита, но он выглядит слишком сложным.

Ответы [ 2 ]

5 голосов
/ 31 октября 2011

Если вы хотите передать Type, он не может быть действительно универсальным - вам придется возвращать единственный тип, который не имеет прямого отношения к входу , следовательно, что-то как:

    public static Array GetUnderlyingEnumValues(Type type)
    {
        Array values = Enum.GetValues(type);
        Type underlyingType = Enum.GetUnderlyingType(type);
        Array arr = Array.CreateInstance(underlyingType, values.Length);
        for (int i = 0; i < values.Length; i++)
        {
            arr.SetValue(values.GetValue(i), i);
        }
        return arr;
    }

Это вектор со строгой типизацией снизу, так что вы можете привести его к int[] и т. Д.

2 голосов
/ 10 ноября 2011

Хотя ответ Марка не неправильный, он несколько излишний. Enum.GetValues(type) возвращает TEnum[], так что этот метод является своего рода ненужным, так как если вы знаете базовый тип, вы можете просто привести TEnum[] к его базовому массиву типов.

var underlyingArray = (int[])Enum.GetValues(typeof(StringComparison));

является допустимым C #, который скомпилируется и не выдаст исключение во время выполнения. Поскольку вам нужен список, когда у вас есть массив, вы можете передать его конструктору List<Tunderlying> или просто вызвать метод расширения ToArray().

Редактировать: вы можете написать функцию как таковую:

public static TUnderlying[] GetValuesAs<TUnderlying>(type enumType)
{
     return Enum.GetValues(enumType) as TUnderlying[];
}

Но тогда вам придется сначала узнать базовый тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...