【问题标题】:Enum with multiple descriptions具有多个描述的枚举
【发布时间】:2013-08-30 13:43:48
【问题描述】:

我有这样的枚举。

public enum Gender
{
    Man = 1,
    Woman = 2
}

我使用 ASP MVC4 在这样的下拉菜单中显示选项。

@Html.DropDownListFor(model => model.Gender, new SelectList(Enum.GetValues(typeof(Namespace.Models.Enum.Gender))))

这就像一个魅力,它在下拉菜单中显示男人/女人。 我的问题是我想在不同的上下文中在这些枚举上显示不同的名称。

如果您是一位妈妈或一位爸爸,那么一种情况就是这样。我想使用性别枚举作为基础,但显示 Mom/Dad instad of Man/Woman。

另一个上下文是男孩/女孩,我仍然想使用性别枚举,但显示不同的文本。

这有可能吗?

编辑 我使用了凯文的解决方案,还添加了另一种类似这样的扩展方法。

public static List<KeyValuePair<string, int>> GetValues(IGenderStrategy genderStrategy)
    {
        Dictionary<string, int> arr = new Dictionary<string, int>();

        foreach (Gender g in System.Enum.GetValues(typeof(Gender)))
            arr.Add(g.ToValue(genderStrategy), (int)g);

        return arr.ToList();
    }

在我看来,我是这样使用的。

@Html.DropDownListFor(model => model.Gender, new SelectList(Chores.Models.Enum.EnumExtentions.GetValues(new Chores.Models.Enum.ParentStrategy()), "value", "key"))

【问题讨论】:

标签: c# asp.net asp.net-mvc asp.net-mvc-4 enums


【解决方案1】:

我喜欢@RakotVT 对使用扩展方法的回答,但会进一步扩展它,因为你需要一种新的扩展方法来应对每一种不太好的情况。

我认为策略模式的变体在这里可能效果更好 (http://www.dofactory.com/Patterns/PatternStrategy.aspx)

类似的东西-

public enum Gender
{
    Man = 1,
    Woman = 2
}

public interface IGenderStrategy
{
    string DisplayName(Gender gender);
}

public class ParentStrategy : IGenderStrategy
{
    public string DisplayName(Gender gender)
    {
        string retVal = String.Empty;
        switch (gender)
        {
            case Gender.Man:
                retVal =  "Dad";
                break;
            case Gender.Woman:
                retVal =  "Mom";
                break;
            default:
                throw new Exception("Gender not found");
        }
        return retVal;
    }
}

public static class EnumExtentions
{
    public static string ToValue(this Gender e, IGenderStrategy genderStategy)
    {
        return genderStategy.DisplayName(e);
    }
}

public class Test
{
    public Test()
    {
        Gender.Man.ToValue(new ParentStrategy());
    }
}

【讨论】:

  • 谢谢!这非常有效。我添加了另一个扩展来返回一个键/值列表,然后一切正常。
【解决方案2】:

尝试为您的枚举添加扩展类。这是这个类的一个例子。

 
public static class EnumExtentions
{
    public static string ToChildValue(this Gender e)
    {
        string retVal = string.Empty;

        switch (e)
        {
            case Gender.Man:
                retVal = "Boy";
                break;
            case Gender.Woman:
                retVal = "Girl";
                break;
        }
        return retVal;
    }


    public static string ToParentValue(this Gender e)
    {
        string retVal = string.Empty;

        switch (e)
        {
            case Gender.Man:
                retVal = "Dad";
                break;
            case Gender.Woman:
                retVal = "Mom";
                break;
        }
        return retVal;
    }
}

【讨论】:

    【解决方案3】:

    不知道这是不是最简洁的方法,但是像这样的方法怎么样:

    @functions{
        IEnumerable<SelectListItem> GetGenderSelectList(GenderContext genderContext)
        {
           return Enum.GetValues(typeof(Namespace.Models.Enum.Gender)).ToList().ConvertAll(x => new SelectListItem(){Value= x.ToString(), Text= GetGenderDescription(x, genderContext)});
        }
    
        string GetGenderDescription(Gender gender, GenderContext genderContext)
        {
           switch (GenderContext)
           {
               case Children: return gender == Man? "Boy" : "Girl";
               case Parents: return gender == Man? "Dad" : "Mom";
               default: return gender.ToString();
           }
        }
    }
    
    @Html.DropDownListFor(model => model.Gender, GetGenderSelectList(model.GenderContext))
    

    这里的 'GenderContext' 是另一个枚举。

    显然,您不需要在页面函数中包含这些函数 - 甚至可以在进入视图之前将项目列表添加到 ViewBag。

    【讨论】:

      猜你喜欢
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多