【问题标题】:how to map enum with database id [duplicate]如何使用数据库ID映射枚举[重复]
【发布时间】:2013-10-22 18:25:56
【问题描述】:

我有枚举:

public enum Days
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3,
    Thursday = 4,
    Friday = 5,
    Saturday = 6,
    Sunday = 7
}

我使用这个枚举将值作为 int 作为 ID 插入到数据库中。但是,当我从数据库中检索值以在我的视图中显示天的名称而不是该数据库 ID 时,如何使用该数据库 ID“映射”enum Days

例如,我显示了一个数据列表,目前我显示了 DayId 和 ID,但是如何映射此 ID 以显示枚举文本(星期一、星期二、...)而不是 ID(1,2, 3..) ?

【问题讨论】:

  • 你也不需要在每个枚举元素前面加上数字。就像Monday = 1, Tuesday, ....
  • 你知道吗,框架中有这样的枚举:msdn.microsoft.com/en-us/library/system.dayofweek.aspx
  • 我知道但是有一个问题,因为我的一天从星期日开始并且占据 0 位置,所以我不能插入“select...”又名默认值 :) 不知道为什么。跨度>

标签: c# asp.net-mvc enums


【解决方案1】:

使用下面的扩展方法来描述你的枚举

/// <summary>
/// Get the whilespace separated values of an enum
/// </summary>
/// <param name="en"></param>
/// <returns></returns>
public static string ToEnumWordify(this Enum en)
{
    Type type = en.GetType();
    MemberInfo[] memInfo = type.GetMember(en.ToString());
    string pascalCaseString = memInfo[0].Name;
    Regex r = new Regex("(?<=[a-z])(?<x>[A-Z])|(?<=.)(?<x>[A-Z])(?=[a-z])");
    return r.Replace(pascalCaseString, " ${x}");
}

或者您可以提供描述以使用下面的枚举获取它

public enum Manufacturer
{
    [Description("I did")]
    Idid = 1,
    [Description("Another company or person")]
    AnotherCompanyOrPerson = 2
}

/// <summary>
/// Get the enum description value
/// </summary>
/// <param name="en"></param>
/// <returns></returns>
public static string ToEnumDescription(this Enum en) //ext method
{
    Type type = en.GetType();
    MemberInfo[] memInfo = type.GetMember(en.ToString());
    if (memInfo != null && memInfo.Length > 0)
    {
        object[] attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
        if (attrs != null && attrs.Length > 0)
            return ((DescriptionAttribute)attrs[0]).Description;
    }
    return en.ToString();
}

【讨论】:

    【解决方案2】:

    你可以使用Enum.ToObject(typeof(Days), item)下面的扩展方法会帮助你。

    private List<string> ConvertIntToString(Enum days, params int[]  daysIds)
    {
        List<string> stringList = new List<string>();
    
        foreach (var item in daysIds)
        {
            stringList.Add(Enum.ToObject(days.GetType(), item).ToString());
        }
    
        return stringList;
    }
    

    如下使用:

    ConvertIntToString(new Days(),2, 4, 6, 1);
    

            private List<Enum> ConvertIntToString(params int[] daysIds)
            {
                List<Enum> EnumList = new List<Enum>();
                foreach (var item in daysIds)
                {
                    EnumList.Add((Days)item);
                }
                return EnumList;
            }
    

    【讨论】:

      【解决方案3】:

      请尝试关注。

      //Let's say you following ids from the database
       List<int> lstFromDB = new List<int>() { 1, 2, 3 };
      
       List<string> result = (from int l in lst
                              select ((Days)l).ToString()
                              ).ToList();
      

      【讨论】:

        【解决方案4】:

        我不建议这种方法。您需要几天的查找表。比如

        create table Days(
         DaysID INT PRIMARY KEY,
         Name VARCHAR(20))
        

        所有其他表都将具有 DaysID 的外键列。我建议反对您的方法的原因是因为您将自己限制在可能会更改的硬编码值。

        如果需要,您可以将 Days 表加载到 List&lt;KeyValuePair&lt;int, string&gt;&gt;。如果您保持原样,那么查看数据库的任何人都不会知道 DaysID 1、2、3、4 等代表的方式。

        我希望这会有所帮助。

        【讨论】:

          【解决方案5】:

          你真的不需要任何特别的东西,你可以将你从数据库中获取的整数转换为你的枚举:

          int valueFromDB = 4;
          Days enumValue = (Days)valueFromDB;
          

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-05
          • 1970-01-01
          • 2019-10-09
          • 2019-08-02
          • 2020-12-13
          • 1970-01-01
          • 1970-01-01
          • 2011-05-27
          相关资源
          最近更新 更多