2013-03-27 71 views
0

我有一個存儲過程返回一個選擇 這樣的:地圖數據表上課,變更類型爲int要枚舉

select name , family , sex from person 

我有一個名爲一類人是這樣的:

public class person { 
     string name {get;set;} 
     string family {get;set;} 
     GenderEnum sex {get;set;} 
     } 

和我有一個名爲GenderEnum像這樣的枚舉:

Enum GenderEnum 
{ 
Man = 1 , 
Woman = 2 , 
} 

我想轉換我的數據表t o人的IList。

我的問題是:當我想將性別列轉換爲性別字段時,我將大多數類型的int轉換爲GenderEnum。

不要忘記,我最有一個通用的方法來轉換所有的DataTable到所有類 和這種方法最認識到每個屬性都有枚舉類型。

這種方法來繪製所有列的所有屬性根據名稱

我寫這篇文章的方法,但這種並非適用於所有類型的工作。

exapmle:如果我的列是int,並且我的屬性是嚴格的並且名稱相同,則map不起作用。

public List<T> ConvertTo<T>(DataTable datatable) where T : new() 
    { 
     var temp = new List<T>(); 
     try 
     { 
      var columnsNames = (from DataColumn dataColumn in datatable.Columns select dataColumn.ColumnName).ToList(); 
      temp = datatable.AsEnumerable().ToList().ConvertAll<T>(row => GetObject<T>(row, columnsNames)); 
      return temp; 
     } 
     catch 
     { 
      return temp; 
     } 

    } 
private T GetObject<T>(DataRow row, List<string> columnsName) where T : new() 
    { 
     T obj = new T(); 
     try 
     { 
      string columnname = ""; 

      PropertyInfo[] Properties = typeof(T).GetProperties(); 
      foreach (PropertyInfo objProperty in Properties) 
      { 
       columnname = columnsName.Find(name => name.ToLower() == objProperty.Name.ToLower()); 
       if (!string.IsNullOrEmpty(columnname)) 
       { 
        var value = row[columnname]; 

        if (!string.IsNullOrEmpty(value.ToString())) 
        { 

         Type type; 

         type = Nullable.GetUnderlyingType(objProperty.PropertyType) ?? objProperty.PropertyType; 

         objProperty.SetValue(obj, 
              type == value.GetType() 
               ? Convert.ChangeType(value, type) 
               : System.Enum.ToObject(type, value), null); 
        } 
       } 
      } 
      return obj; 
     } 
     catch (Exception exception) 
     { 
      return obj; 
     } 
    } 

回答

4

我認爲你是在自找麻煩與此GetObject的方法,你會更好切換到EF或(幾乎)任何其他ORM,因爲你正在做的事情是非常有風險。考慮這個代碼的可維護性和可讀性。但是,我知道你可能受到最後期限的壓力,在這個階段無法做太多的事情。

要爲您的問題提供了一個快速修復,請考慮修改您的類,如下所示:

public class Person 
{ 
    public String Name { get; set; } 

    public String Family { get; set; } 

    public Int32 Sex { get; set; } 

    public GenderEnum EnumeratedSex 
    { 
     get 
     { 
      return Sex == 1 ? GenderEnum.Man : GenderEnum.Woman; 
     } 
    } 
} 

public enum GenderEnum 
{ 
    Man = 1, 
    Woman = 2 
} 

我相信你的性愛場簡直是在數據庫中一個int,但如果沒有,請相應地改變它。

請讓我知道這是否有任何幫助。

+1

答案正是我的問題解決。 – 2013-03-27 20:25:06

+0

我很高興能幫上忙。 – 2013-03-27 20:40:29

1

而不是這樣做,爲什麼不嘗試使用實體框架?看到這個link供您參考

+0

我使用EF進行小數據查詢。這個查詢有非常連接和子查詢等。我最常用的SP爲retern數據集。然後我最轉換數據集類。 – 2013-03-27 10:27:39

+0

我猜EF比做這些事情更好。而且它更精確 – lexeRoy 2013-03-27 10:30:17