C# 具有多个描述的枚举
我的枚举是这样的C# 具有多个描述的枚举,c#,asp.net,asp.net-mvc,asp.net-mvc-4,enums,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Enums,我的枚举是这样的 public enum Gender { Man = 1, Woman = 2 } @Html.DropDownListFor(model => model.Gender, new SelectList(Enum.GetValues(typeof(Namespace.Models.Enum.Gender)))) public static List<KeyValuePair<string, int>> GetValues(IGe
public enum Gender
{
Man = 1,
Woman = 2
}
@Html.DropDownListFor(model => model.Gender, new SelectList(Enum.GetValues(typeof(Namespace.Models.Enum.Gender))))
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();
}
我使用ASP MVC4在下拉列表中显示选项,如下所示
public enum Gender
{
Man = 1,
Woman = 2
}
@Html.DropDownListFor(model => model.Gender, new SelectList(Enum.GetValues(typeof(Namespace.Models.Enum.Gender))))
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();
}
这就像一个符咒,它在下拉列表中显示男人/女人。
我的问题是,我希望在不同的上下文中在这些枚举上显示不同的名称
比如,如果你是一个母亲或父亲。我想使用性别枚举作为基础,但显示男/女的妈妈/爸爸
另一个上下文是Boy/Girl,我仍然希望使用性别枚举,但显示不同的文本
这有可能吗
编辑
我使用了Kevin的解决方案,还添加了另一个类似这样的扩展方法
public enum Gender
{
Man = 1,
Woman = 2
}
@Html.DropDownListFor(model => model.Gender, new SelectList(Enum.GetValues(typeof(Namespace.Models.Enum.Gender))))
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();
}
尝试为枚举添加扩展类。下面是这个类的一个例子
公共静态类枚举扩展
{
公共静态字符串到ChildValue(此为e)
{
string retVal=string.Empty;
开关(e)
{
案件性别:男子:
retVal=“男孩”;
打破
案件性别:妇女:
retVal=“女孩”;
打破
}
返回返回;
}
公共静态字符串ToParentValue(此为e)
{
string retVal=string.Empty;
开关(e)
{
案件性别:男子:
retVal=“爸爸”;
打破
案件性别:妇女:
retVal=“Mom”;
打破
}
返回返回;
}
}
尝试为枚举添加扩展类。下面是这个类的一个例子
公共静态类枚举扩展
{
公共静态字符串到ChildValue(此为e)
{
string retVal=string.Empty;
开关(e)
{
案件性别:男子:
retVal=“男孩”;
打破
案件性别:妇女:
retVal=“女孩”;
打破
}
返回返回;
}
公共静态字符串ToParentValue(此为e)
{
string retVal=string.Empty;
开关(e)
{
案件性别:男子:
retVal=“爸爸”;
打破
案件性别:妇女:
retVal=“Mom”;
打破
}
返回返回;
}
}
不知道这是不是最整洁的方式,但下面的方式怎么样:
@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))
@函数{
IEnumerable GetGenderSelectList(GenderContext GenderContext)
{
返回Enum.GetValues(typeof(Namespace.Models.Enum.Gender)).ToList().ConvertAll(x=>newselectListItem(){Value=x.ToString(),Text=GetGenderDescription(x,genderContext)});
}
字符串GetGenderDescription(性别,GenderContext GenderContext)
{
开关(GenderContext)
{
案例儿童:返回性别==男性?“男孩”:“女孩”;
案例父母:返回性别==男子?“父亲”:“母亲”;
默认值:返回gender.ToString();
}
}
}
@DropDownListFor(model=>model.Gender,GetGenderSelectList(model.GenderContext))
这里的“GenderContext”是另一个枚举
显然,您不需要在页面功能中包含这些功能-可以在进入视图之前将项目列表添加到ViewBag中。不知道这是否是最整洁的方式,但是类似于:
@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))
@函数{
IEnumerable GetGenderSelectList(GenderContext GenderContext)
{
返回Enum.GetValues(typeof(Namespace.Models.Enum.Gender)).ToList().ConvertAll(x=>newselectListItem(){Value=x.ToString(),Text=GetGenderDescription(x,genderContext)});
}
字符串GetGenderDescription(性别,GenderContext GenderContext)
{
开关(GenderContext)
{
案例儿童:返回性别==男性?“男孩”:“女孩”;
案例父母:返回性别==男子?“父亲”:“母亲”;
默认值:返回gender.ToString();
}
}
}
@DropDownListFor(model=>model.Gender,GetGenderSelectList(model.GenderContext))
这里的“GenderContext”是另一个枚举
显然,您不需要在页面函数中包含这些函数-可以在进入视图之前将项目列表添加到ViewBag中。我喜欢@RakotVT使用扩展方法的答案,但会将其进一步扩展,因为您需要一种新的扩展方法来处理各种不太好的情况 我认为策略模式的一种变体在这里可能更有效() 像这样的-
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());
}
}
我喜欢@RakotVT使用扩展方法的回答,但我会进一步扩展它,因为对于每种不太好的情况,您都需要一种新的扩展方法 我认为策略模式的一种变体在这里可能更有效() 像这样的-
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());
}
}
这可能会让你开始。我已经编辑了你的标题。请看,“,其中的共识是“不,他们不应该”。好的,谢谢。我会记住的。这可能会让你开始。我已经编辑了你的标题。请看,“,其中的共识是“不,他们不应该”。好的,谢谢。我会记住的,谢谢!这很有效。我添加了另一个扩展来返回一个键/值列表,然后一切正常。谢谢!这很有效。我添加了另一个扩展来返回一个键/值列表,然后一切都正常工作。