2011-04-20 63 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