【问题标题】:Get Enum Name or Description from enum value stored in Datatable从存储在数据表中的枚举值获取枚举名称或描述
【发布时间】:2018-02-07 13:11:35
【问题描述】:

我有一个这样的银行主表枚举(列名:BankAccountType

public enum eBankAccountType
{
    Savings = 1,
    Current = 2,
    CC = 3,
    Other = 4,
 }

我将每一行的枚举值存储在一个表数据库中。

现在在从数据库中获取记录时,我只返回这个枚举值。但是我应该如何在 C# 中编写一个接受

的泛型方法
  • 数据表(从数据库选择查询返回)
  • ColumnName(s)(具有从表 Bank 中检索到的值,例如 1,2 等,在本例中为“BankAccountType”)和
  • EnumType(s)(我想在 Enum 字符串中将此列值转换为该类型,例如 BankAccountType == 1 然后 SavingsBankAccountType == 2 然后 Current 等等)

并返回一个为每一行添加一个新列的数据表(在本例中为“BankAccountTypeDescription”)

请注意,从数据库返回的数据表可以有多个由不同枚举填充的列。

如果我使用任何静态枚举类型,我都能做到,但我想创建更多通用方法。

我正在尝试创建一个类似这样的通用方法。

public DataTable GetDescriptionforEnumColumn(DataTable dt, Enum[] objEnum, string[] colName)
{

    foreach (string item in colName)
    {
        string strIDColumnName = item;
        string strNewColumnName = item + "Description";
        dt.Columns.Add(strNewColumnName);
        foreach (DataRow row in dt.Rows)
        {
            row[strNewColumnName] = Enum.Parse(objEnum[0].GetType(), ConvertTo.String(row[item]), true);
        }
    }

    return dt;
}

然后这样称呼它。

GetDescriptionforEnumColumn(dtBank, array of enum, array of columNames);

但我遇到的问题是在这个泛型方法中传递和检索枚举(或枚举类型)数组。

【问题讨论】:

  • 你试过了吗?你第一次尝试编写这样一个通用方法是什么?
  • 大概您开始编写一个方法,该方法采用DataTable 和列名和枚举类型;进展如何?你在哪里卡住了?另外:为什么人们仍然坚持使用DataTable
  • 用我到目前为止所尝试的方法更新了问题。
  • @MarcGravell,你不使用数据表是对的,但我正在从事的项目是几年前的 asp .net,只有数据表。因此将其转换为 List 或其他任何内容将是一项艰巨的任务

标签: c# generics enums datatables


【解决方案1】:

在我看来,您的主要问题是当您只有 1 时如何获取值 Savings 并使其适用于所有类型的枚举。

如果我的假设是正确的,那么Enum.ToObject 方法就是你的朋友:

public static string convertEnum(int intValue, Type enumType) 
{
    return Enum.ToObject(enumType, intValue).ToString();
}

为了让这个方法更安全一点,你可以使用Enum.IsDefined 方法检查intValue 是否在这个枚举类型中被定义:

public static string convertEnum(int value, Type enumType) 
{
    if (!Enum.IsDefined(enumType, value))
    {
        throw new ArgumentException("Wrong call mate! gimme somthing to work with...");
    }

    return Enum.ToObject(enumType, value).ToString();
}

我想有了这些知识,您应该能够自己编写方法的其余部分。好运

【讨论】:

    【解决方案2】:
    private DataTable GetDescriptionForEnumColumn(DataTable dt, dynamic columnsInfo)
        {
            foreach (var item in columnsInfo)
            {
                string strIDColumnName = item.IDColumnName;
                string strNewColumnName = item.IDColumnName + "Description";
                Enum columnEnumName = item.ColumnType;
    
                dt.Columns.Add(strNewColumnName);
                foreach (DataRow row in dt.Rows)
                {
                    if ((ConvertTo.Integer(row[strIDColumnName]) > 0))
                        row[strNewColumnName] = SystemEnum.GetEnumDescriptionFromString(Enum.Parse(columnEnumName.GetType(), ConvertTo.String(row[strIDColumnName]), true).ToString(), columnEnumName.GetType());
                }
            }
    
            return dt;
        }
    

    并这样称呼它:

    DataTable dt = GetDescriptionForEnumColumn(dtBank, new[] { new { ColumnType = (Enum)new eBankAccountType(), IDColumnName = "BankAccountType" } });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-28
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      • 1970-01-01
      • 2019-10-02
      相关资源
      最近更新 更多