Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有多个描述的枚举_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 4_Enums - Fatal编程技术网

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

这可能会让你开始。我已经编辑了你的标题。请看,“,其中的共识是“不,他们不应该”。好的,谢谢。我会记住的。这可能会让你开始。我已经编辑了你的标题。请看,“,其中的共识是“不,他们不应该”。好的,谢谢。我会记住的,谢谢!这很有效。我添加了另一个扩展来返回一个键/值列表,然后一切正常。谢谢!这很有效。我添加了另一个扩展来返回一个键/值列表,然后一切都正常工作。