Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将datatable映射到类并将类型Int更改为枚举_C#_.net_Reflection - Fatal编程技术网

C# 将datatable映射到类并将类型Int更改为枚举

C# 将datatable映射到类并将类型Int更改为枚举,c#,.net,reflection,C#,.net,Reflection,我有一个存储过程返回一个select 像这样: select name , family , sex from person public class person { string name {get;set;} string family {get;set;} GenderEnum sex {get;set;} } 我有一个类,它命名了这样的人: select name , family , sex from pers

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

select name , family , sex from person
 public class person {
         string name {get;set;}
         string family {get;set;}
         GenderEnum sex {get;set;}
       }
我有一个类,它命名了这样的人:

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 ,
}
我想将我的datatable转换为Person的IList

我的问题是:当我想将sex列转换为sex字段时,我通常会将int类型转换为GenderEnum

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

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

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

例如:如果我的列是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;
        }
    }
public-List-ConvertTo(DataTable-DataTable),其中T:new()
{
var temp=新列表();
尝试
{
var columnsNames=(从datatable.Columns中的DataColumn DataColumn选择DataColumn.ColumnName).ToList();
temp=datatable.AsEnumerable().ToList().ConvertAll(行=>GetObject(行,列名称));
返回温度;
}
抓住
{
返回温度;
}
}
private T GetObject(DataRow行,List列名称),其中T:new()
{
T obj=新的T();
尝试
{
字符串columnname=“”;
PropertyInfo[]Properties=typeof(T).GetProperties();
foreach(PropertyInfo对象属性在属性中)
{
columnname=columnsName.Find(name=>name.ToLower()==objProperty.name.ToLower());
如果(!string.IsNullOrEmpty(columnname))
{
var值=行[列名称];
如果(!string.IsNullOrEmpty(value.ToString()))
{
类型;
type=Nullable.GetUnderlineType(objProperty.PropertyType)??objProperty.PropertyType;
objProperty.SetValue(obj,
type==value.GetType()
?转换.ChangeType(值、类型)
:System.Enum.ToObject(类型、值),null;
}
}
}
返回obj;
}
捕获(异常)
{
返回obj;
}
}

与其这样做,为什么不尝试使用实体框架呢??请参见此以供参考

与其这样做,为什么不尝试使用实体框架呢??请参阅此以供参考

我认为您使用此方法是在自找麻烦,您最好切换到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,但如果不是,请相应地更改它


请让我知道这是否有帮助。

我认为你在自找麻烦使用这个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,但如果不是,请相应地更改它


请让我知道这是否有帮助。

我使用EF进行smal查询。这个查询有非常多的连接和子查询等。我最常用的是SP作为retern数据集。然后我将数据集转换成类。我想EF将是一个更好的方法,而不是考虑做这些事情。更精确的是,我使用EF进行smal查询。这个查询有非常多的连接和子查询等。我最常用的是SP作为retern数据集。然后我将数据集转换成类。我想EF将是一个更好的方法,而不是考虑做这些事情。但它更精确