【问题标题】:map datatable to class And Change Type Int To Enum将数据表映射到类并将类型 Int 更改为 Enum
【发布时间】:2013-03-27 22:46:25
【问题描述】:

我有一个返回一个选择的存储过程 像这样:

select name , family , sex from person

我有一门课是这样命名的:

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

我有一个 Enum,它像这样命名为 GenderEnum:

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

我想将我的数据表转换为 IList of Person 。

我的问题是:当我想将性别列转换为性别字段时,我最常将 int 类型转换或转换为 GenderEnum。

不要忘记,我最有一种通用方法可以将所有 DataTable 转换为 All Class 而且这个方法最能识别每个属性都有枚举类型。

此方法根据名称将所有列映射到所有属性

我写了这个方法,但这不适用于所有类型。

例如:如果我的列是 int 并且我的属性是 strinbe 并且具有相同的名称,则映射不起作用。

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

【问题讨论】:

    标签: c# .net reflection


    【解决方案1】:

    我认为您是在使用这种 GetObject 方法自找麻烦,您最好切换到 EF 或(实际上)任何其他 ORM,因为您所做的事情风险极大。考虑此代码的可维护性和可读性。不过,据我了解,您可能面临截止日期的压力,现阶段无能为力。

    为了快速解决您的问题,请考虑修改您的 Person 类,如下所示:

    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
    }
    

    我认为您的 Sex 字段只是数据库中的一个 int,但如果不是,请相应更改。

    如果有任何帮助,请告诉我。

    【讨论】:

      【解决方案2】:

      除了这样做,为什么不尝试使用实体框架呢?请参阅此link 供您参考

      【讨论】:

      • 我使用 EF 进行小查询。这个查询有非常连接和子查询等。我最常使用 SP 作为 retern 数据集。然后我最常将数据集转换为类。
      • 我想 EF 会比考虑做这些事情更好。而且它更精确
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      相关资源
      最近更新 更多