将数据表映射到类并将类型更改为Int到枚举

时间:2013-03-27 10:21:09

标签: c# .net reflection

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

select name , family , sex from person

我有一个名为person的人:

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

我有一个名为GenderEnum的枚举像这样:

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

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

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

不要忘记我最常使用一种通用方法将所有DataTable转换为All Class 并且此方法最常识别每个属性都具有枚举类型。

此方法根据名称

将所有列映射到所有属性

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

for exapmle:如果我的列是int并且我的属性是strinbe并且具有相同的名称,则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;
        }
    }

2 个答案:

答案 0 :(得分: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
}

我相信你的Sex字段只是数据库中的一个int,但如果没有,请相应更改。

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

答案 1 :(得分:1)

为什么不尝试使用Entity框架呢?请参阅此link以供参考