Поведение моделировать перечисление, реализовывая интерфейс

Скажите, что у меня есть перечисление что-то как:

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(this TEnum enumObj)

однако, для использования значений DisplayString в UI, выпадающем, я должен был бы добавить ограничение вроде

: where TEnum has extension ToDisplayString

Очевидно, ни одно из этого не собирается работать вообще с текущим подходом, если нет некоторый умный прием, о котором я не знаю.

У кого-либо есть какие-либо идеи о том, как я смог реализовывать что-то вроде этого?

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

3 ответа

Есть ли веская причина использовать здесь 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 () .

27
ответ дан 1 December 2019 в 21:37
поделиться

Можно сделать так:

public static string ToOrderStatusDisplayString(this Enum status)
{    
    switch ((OrderStatus)status)
    {
         ...
    }
}

Затем ограничить TEnum до Enum: where TEnum : System.Enum

Конечно, таким образом вы получите кучу методов на самом Enum и потеряете безопасность типов.

-4
ответ дан 1 December 2019 в 21:37
поделиться

Вместо использования "ToDisplayString", просто переопределите ToString() вашего enum. Поэтому, если enum переопределяет его, он будет принимать его, в противном случае он будет принимать поведение ToString по умолчанию (в ToSelectList).

1
ответ дан 1 December 2019 в 21:37
поделиться
Другие вопросы по тегам:

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