模拟实现接口的枚举的行为

fea*_*net 13 c# extension-methods enums interface

说我有一个类似的枚举:

enum OrderStatus
{
    AwaitingAuthorization,
    InProduction,
    AwaitingDespatch
}
Run Code Online (Sandbox Code Playgroud)

我还在我的枚举上创建了一个扩展方法来整理UI中的显示值,所以我有类似的东西:

public static string ToDisplayString(this OrderStatus status)
{
    switch (status)
    {
        case Status.AwaitingAuthorization:
            return "Awaiting Authorization";

        case Status.InProduction:
            return "Item in Production";

        ... etc
    }
}
Run Code Online (Sandbox Code Playgroud)

灵感来自这里的优秀帖子,我想SelectList用扩展方法将我的枚举绑定到一个:

public static SelectList ToSelectList<TEnum>(this TEnum enumObj)

但是,要在UI下拉列表中使用DisplayString值,我需要添加一个约束

: where TEnum has extension ToDisplayString

显然,除非有一些我不知道的聪明伎俩,否则这一切都不会对当前的方法起作用.

有没有人对我如何能够实现这样的事情有任何想法?

Jay*_*Jay 27

有没有令人信服的理由在enum这里使用?

当你开始跳过疯狂的箍来使用enums时,可能是时候使用一个类了.

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");
}
Run Code Online (Sandbox Code Playgroud)

您使用它与以下相同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);
}
Run Code Online (Sandbox Code Playgroud)

字符串表示是内置的,您只需要ToString().