枚举有多个描述

我有这样的枚举。

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

我使用ASP MVC4来显示这样的下拉选项。

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

这就像一个魅力,它显示了男人/女人的下拉。 我的问题是,我希望在不同的上下文中显示不同的名称。

如果你是一个妈妈或一个爸爸,就像一个背景。 我想使用性别enum作为基础,但显示男/女的妈妈/爸爸instad。

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

这有可能吗?

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

 public static List<KeyValuePair> GetValues(IGenderStrategy genderStrategy) { Dictionary arr = new Dictionary(); 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")) 

我喜欢@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()); } } 

尝试为您的Enum添加Extentions类。 这是这个类的一个例子。

 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; } } 

Dunno,如果这是最好的方式,但是如下:

 @functions{ IEnumerable 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’是另一个Enum。

很明显,您不需要在页面函数中使用这些函数 – 可以在进入视图之前将项目列表添加到ViewBag中。