Дополнительный метод на перечислении, не экземпляр перечисления

У меня есть перечисление для моих Вещей как так:

public enum Things
{
   OneThing,
   AnotherThing
}

Я хотел бы записать дополнительный метод для этого перечисления (подобный ответу Реквизиции здесь), но в то время как тот метод работает над экземпляром перечисления, крыла

Things thing; var list = thing.ToSelectList();

Я хотел бы, чтобы это работало над фактическим перечислением вместо этого:

var list = Things.ToSelectList();

Я мог просто сделать

var list = default(Things).ToSelectList();

Но мне не нравится вид этого :)

Я стал ближе со следующим дополнительным методом:

public static SelectList ToSelectList(this Type type)
{
   if (type.IsEnum)
   {
      var values = from Enum e in Enum.GetValues(type)
                   select new { ID = e, Name = e.ToString() };
      return new SelectList(values, "Id", "Name");
   }
   else
   {
      return null;
   }
}

Используемый как так:

var list = typeof(Things).ToSelectList();

Мы можем сделать немного лучше, чем это?

44
задан Community 23 May 2017 в 12:09
поделиться

2 ответа

Методы расширения работают только с экземплярами, поэтому это невозможно, но с некоторыми хорошо подобранными именами классов / методов и универсальными шаблонами вы можете создать результат, который выглядит так же хорошо:

public class SelectList
{
    // Normal SelectList properties/methods go here

    public static SelectList Of<T>()
    {
        Type t = typeof(T);
        if (t.IsEnum)
        {
            var values = from Enum e in Enum.GetValues(type)
                         select new { ID = e, Name = e.ToString() };
            return new SelectList(values, "Id", "Name");
        }
        return null;
    }
}

Затем вы можете получить свой список выбора следующим образом:

var list = SelectList.Of<Things>();

IMO это читается намного лучше, чем Things.ToSelectList () .

72
ответ дан 26 November 2019 в 22:05
поделиться

Нет.

Лучшее, что вы можете сделать, - это поместить его в статический класс, например:

public static class ThingsUtils { 
    public static SelectList ToSelectList() { ... }
}
5
ответ дан 26 November 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: