C# 从Datatable中存储的枚举值获取枚举名称或描述

C# 从Datatable中存储的枚举值获取枚举名称或描述,c#,generics,enums,datatables,C#,Generics,Enums,Datatables,对于银行主表列名,我有这样一个枚举:BankAccountType 我在一个表数据库中为每一行存储枚举值 现在,在从数据库获取记录时,我只返回这个枚举值。但是我应该如何用C编写一个接受 从数据库选择查询返回的Datatable 从表Bank(在本例中为“BankAccountType”)中检索的列名,其值如1、2等,以及 我希望将此列值转换为枚举字符串中的枚举类型,例如,如果BankAccountType==1,则为Savings,BankAccountType==2,则为Current,依此类

对于银行主表列名,我有这样一个枚举:BankAccountType

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

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

从数据库选择查询返回的Datatable 从表Bank(在本例中为“BankAccountType”)中检索的列名,其值如1、2等,以及 我希望将此列值转换为枚举字符串中的枚举类型,例如,如果BankAccountType==1,则为Savings,BankAccountType==2,则为Current,依此类推 并返回一个datatable,其中为每行添加了一个新列(在本例中为“BankAccountTypeDescription”)

请注意,从数据库返回的datatable可以包含多个从不同枚举填充的列

如果我使用任何静态枚举类型,我都可以做到这一点,但我想创建更多的通用方法

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

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);
这样称呼它

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

但我遇到的问题是在这种通用方法中传递和检索枚举或枚举数组类型。

在我看来,您的主要问题是如何在只有1的情况下节省值,并使其适用于所有类型的枚举

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

public static string convertEnum(int intValue, Type enumType) 
{
    return Enum.ToObject(enumType, intValue).ToString();
}
要使此方法更加安全,可以使用以下方法检查此枚举类型中是否定义了intValue:

我想有了这些知识,你应该能够自己写下剩下的方法了。好运

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

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