У меня есть перечисление для моих Вещей как так:
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();
Мы можем сделать немного лучше, чем это?
Методы расширения работают только с экземплярами, поэтому это невозможно, но с некоторыми хорошо подобранными именами классов / методов и универсальными шаблонами вы можете создать результат, который выглядит так же хорошо:
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 ()
.
Нет.
Лучшее, что вы можете сделать, - это поместить его в статический класс, например:
public static class ThingsUtils {
public static SelectList ToSelectList() { ... }
}