Скажите, что у меня есть перечисление что-то как:
enum OrderStatus
{
AwaitingAuthorization,
InProduction,
AwaitingDespatch
}
Я также создал дополнительный метод на своем перечислении для уборки отображенных значений в UI, таким образом, у меня есть что-то как:
public static string ToDisplayString(this OrderStatus status)
{
switch (status)
{
case Status.AwaitingAuthorization:
return "Awaiting Authorization";
case Status.InProduction:
return "Item in Production";
... etc
}
}
Вдохновленный превосходным сообщением здесь, я хочу связать свои перечисления с a SelectList
с дополнительным методом:
public static SelectList ToSelectList
однако, для использования значений DisplayString в UI, выпадающем, я должен был бы добавить ограничение вроде
: where TEnum has extension ToDisplayString
Очевидно, ни одно из этого не собирается работать вообще с текущим подходом, если нет некоторый умный прием, о котором я не знаю.
У кого-либо есть какие-либо идеи о том, как я смог реализовывать что-то вроде этого?
Есть ли веская причина использовать здесь enum
?
Когда вы начинаете прыгать через сумасшедшие обручи, чтобы использовать enum
s, это может пора использовать класс.
public class OrderStatus
{
OrderStatus(string display) { this.display = display; }
string display;
public override string ToString(){ return display; }
public static readonly OrderStatus AwaitingAuthorization
= new OrderStatus("Awaiting Authorization");
public static readonly OrderStatus InProduction
= new OrderStatus("Item in Production");
public static readonly OrderStatus AwaitingDispatch
= new OrderStatus("Awaiting Dispatch");
}
Вы используете его так же, как enum
:
public void AuthorizeAndSendToProduction(Order order, ProductionQueue queue)
{
if(order.Status != OrderStatus.AwaitingAuthorization)
{
Console.WriteLine("This order is not awaiting authorization!");
return;
}
order.Status = OrderStatus.InProduction;
queue.Enqueue(order);
}
Строковое представление встроено, и все, что вам нужно, это ToString ()
.
Можно сделать так:
public static string ToOrderStatusDisplayString(this Enum status) { switch ((OrderStatus)status) { ... } }
Затем ограничить TEnum до Enum: where TEnum : System.Enum
Конечно, таким образом вы получите кучу методов на самом Enum и потеряете безопасность типов.
Вместо использования "ToDisplayString", просто переопределите ToString() вашего enum. Поэтому, если enum переопределяет его, он будет принимать его, в противном случае он будет принимать поведение ToString по умолчанию (в ToSelectList).