Метод подсчета и расширения ToList для Enum?

Можно ли создать метод расширения Count и ToList для экземпляра Enum? Я пробовал это, но не знаю, как заменить "???", связанный с типом enum "e".

public static class EnumExtensions 
{ 
    public static int Count(this Enum e) 
    { 
        return Enum.GetNames(typeof(???)).Length; 
    } 

    public static List<???> ToList(this Enum e) 
    { 
        return Enum.GetValues(typeof(???)).Cast<???>().ToList(); 
    } 
}

Большое спасибо!

2 ответа

Решение

Ты можешь использовать e.GetType() вместо typeof(???)

public static int Count(this Enum e) 
{ 
    return Enum.GetNames(e.GetType()).Length; 
} 

однако, я не думаю, что это будет работать так, как вы ожидаете, поскольку вы не можете сделать это:

var shouldBe7 = DayOfWeek.Count(); // does not compile

но ты можешь сделать

var shouldBe7 = DayOfWeek.Monday.Count(); // 7

Может быть, лучше просто сделать:

public static class EnumHelper
{
    public static int Count(Type e)
    {
        // use reflection to check that e is an enum
        // or just wait for the Enum method to fail

        return Enum.GetNames(e).Length;
    }
}

который затем используется как

var shouldBe7 = EnumHelper.Count(typeof(DayOfWeek)); // 7

Зачем нужны новые методы расширения? Вы можете использовать доступные:

string[] dayNames = Enum.GetNames(typeof(DayOfWeek));
int count = dayNames.Count();
List<string> list = dayNames.ToList(); 

если вы хотите список типа enum:

List<DayOfWeek> list = Enum.GetValues(typeof(DayOfWeek)).Cast<DayOfWeek>().ToList();

Расширение не имеет смысла, поскольку вы можете расширять его, только если у вас есть экземпляр, а не тип. Но вы могли бы использовать фабричные методы, как это: /questions/33241707/metod-rasshireniya-pri-perechislenii-a-ne-ekzemplyar-perechisleniya/33241729#33241729

Другие вопросы по тегам