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

时间:2018-02-07 13:11:36

标签: c# generics enums datatables

对于银行主表(列名:java.lang.IllegalArgumentException: Segment cannot be null at org.eclipse.xtext.naming.QualifiedName.create(QualifiedName.java:203) at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1008) at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:993) at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:901) at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:864) at mylang.MyLangInterpreter.doEvaluate(GpflInterpreter.java:414) at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:900) at mylang.MyLangInterpreter.doEvaluate(GpflInterpreter.java:450) at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) at mylang.MyLangInterpreter._doEvaluate(GpflInterpreter.java:314) at mylang.MyLangInterpreter.doEvaluate(GpflInterpreter.java:430) at mylang.MyLangInterpreter.lambda$3(GpflInterpreter.java:263) at mylang.MyLangInterpreter$$Lambda$13/974320615.accept(Unknown Source) at java.lang.Iterable.forEach(Iterable.java:75) at mylang.MyLangInterpreter.run(GpflInterpreter.java:265) at fr.mleduc.gpfl.tests.MyLangInterpreterTest.test1(GpflInterpreterTest.java:113) ...

,我有这样的枚举
BankAccountType

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

现在在从数据库获取记录时,我只返回此枚举值。但是我应该如何在接受

的C#中编写泛型方法
  • Datatable(从数据库选择查询返回)
  • ColumnName(s)(从表Bank中检索的值为1,2等,在本案中为'BankAccountType')和
  • EnumType(s)(我希望在枚举字符串中转换此列值,例如public enum eBankAccountType { Savings = 1, Current = 2, CC = 3, Other = 4, } 然后BankAccountType == 1Savings然后BankAccountType == 2等等)

并返回一个数据表,其中为每一行添加了一个新列(在本例中为'BankAccountTypeDescription')

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

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

我正在尝试创建这样的通用方法。

Current

并称之为。

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

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

2 个答案:

答案 0 :(得分:0)

我认为你的主要问题是当你只有一个Savings时如何获得值1并使其适用于所有类型的枚举。

如果我的假设是正确的,那么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();
}

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

答案 1 :(得分:0)

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