2013-03-27 28 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