Как элегантно сравнить перечисление с ячейкой DataTable? - PullRequest
2 голосов
/ 20 апреля 2011

В нашем приложении мы работаем с DataTable много.Это продиктовано интерфейсом с другой системой.Часто столбец в одном из этих DataTable фактически является перечислением, которое тогда имеет тип данных Int16.В настоящее время мы используем магические константы повсюду, но это не красиво.Реальное перечисление было бы намного лучше, но как вы можете написать элегантное сравнение?Особенно учитывая, что DBNull также иногда является допустимым значением.

В идеале мы бы написали это:

if ( tbl.Rows[0]["EnumColumn"] == MyEnum.SomeValue )
    // Do stuff

Но, естественно, это не сработает.Ближе всего к тому, что я могу прийти, это:

if ( tbl.Rows[0]["EnumColumn"] != DBNull.Value && Convert.ToInt32(tbl.Rows[0]["EnumColumn") == (int)MyEnum.SomeValue )
    // DO stuff

Что выглядит безобразно.Любые идеи о том, как сделать это красивее и проще писать?

1 Ответ

3 голосов
/ 20 апреля 2011

Это должно быть примерно так:

tbl.Rows[0]["EnumColumn"] != DbNull.Value && Convert.ToInt32(tbl.Rows[0]["EnumColumn"]) == MyEnum.SomeValue

Я бы сделал статический метод для этого:

    public enum TestEnum
    {
        A = 1,
        B = 2
    }

    public static bool EqualsTestEnum(object value, TestEnum enumValue)
    {
        if (value == null || value == DBNull.Value)
        {
            return false;
        }

        int i;
        if (int.TryParse(value.ToString(), out i))
        {
            return i == (int) enumValue;
        }

        return false;
    }
...