2011-04-20 71 views
2

在我们的应用程序中,我们使用了很多DataTable。这是由另一个系统的接口决定的。通常这些DataTable中的一列中的列实际上是一个枚举,其后是Int16数据类型。目前我们在各地都使用魔术常数,但那不太好。一个真正的枚举会好得多,但你怎么能写出一个优雅的比较?特别是考虑到DBNull有时也是有效的值。如何优雅地比较枚举与DataTable单元格?

理想的情况下,我们可以写成这样:

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 

这看起来很丑陋。任何想法如何使这个更漂亮,更容易写?

回答

3

应该是这样的:

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

会抛出异常的'DBNull'。哦,对不起,我的例子对此有一个错误。固定。 – 2011-04-20 11:43:32

+0

我认为这个新代码会更好。我真的很喜欢使用通用的,但它似乎并没有在我的编译器工作:( – 2011-04-20 11:50:24

+0

检查在这里:http://stackoverflow.com/questions/79126/create-generic-method-constraining-t-to- an-enum – 2011-04-20 12:00:18