4

在这里,我提出了第一种方法:即在 DataSet 上使用 foreach 子句来获取项目并填写您的实体。但是当某些东西发生变化时,这个方法就不能被重用。

所以我认为也许反射应该是我的场景的最佳方法。以下是详细信息:

1.我的实体定义如下:

using System.ComponentModel;

namespace WarningServiceForYM.Model
{
   public class StuffEntity
   {
    [Description("企业ID")]
    public string EnterpriseID { get; set; }  

     [Description("冰柜编号")]
    public string FridgeID { get; set; }        

    [Description("冰柜名称")]
    public string FridgeName { get; set; }   

    [Description("手机号码")]
    public string PhoneNumber { get; set; }  

    [Description("设备名称")]
    public string EquipmentName { get; set; } 

    [Description("采集参数")]
    public string PickingParams { get; set; }   

    [Description("一路温度")]
    public string TempOne { get; set; }         

    [Description("二路温度")]
    public string TempTwo { get; set; }         

    [Description("三路温度")]
    public string TempThree { get; set; }         

    [Description("四路温度")]
    public string TempFour { get; set; }         

    [Description("五路温度")]
    public string TempFive { get; set; }         

    [Description("六路温度")]
    public string TempSix { get; set; }         

    [Description("七路温度")]
    public string TempSeven { get; set; }         

    [Description("八路温度")]
    public string TempEight { get; set; }         

    [Description("温度最低")]
    public string  Min { get; set; }    

    [Description("温度最高")]
    public string Max { get; set; }  

    [Description("采集时间")]
    public string PickingTime { get; set; } 

    [Description("通知间隔")]
    public string WarningPeriod { get; set; }  

    [Description("延时")]
    public string PendingTime { get; set; }  

    [Description("通知开关")]
    public string Switch { get; set; }  

    [Description("最后通知时间")]
    public string LastInformTime { get; set; }  
    }
}
  1. 下面是数据集截图: 在此处输入图像描述

我已将此 DataSet 的数据保存到 csv 文件中,请单击此处查找。

StuffEntity 中的内部属性与 DataSet 中的列标题具有相同的描述。

谁能给我一种方法来展示如何将此 Dataset 转换为 StuffEntity ? thx。

4

1 回答 1

6

好的,使用反射:

public static T GetEntity<T>(DataRow row) where T : new()
{
    var entity = new T();
    var properties = typeof(T).GetProperties();

    foreach (var property in properties)
    {
        //Get the description attribute
        var descriptionAttribute = (DescriptionAttribute)property.GetCustomAttributes(typeof(DescriptionAttribute), true).SingleOrDefault();
        if (descriptionAttribute == null)
            continue;

        property.SetValue(entity, row[descriptionAttribute.Description]);
    }

    return entity;
}

你可以像这样使用它:

foreach (DataRow dataRow in dataSet.Tables[0].Rows)
{
    var e = GetEntity<StuffEntity>(dataRow);
    Console.WriteLine(e.EnterpriseID);
}

它是一个通用实现,因此您可以将它与您想要的任何其他类型或数据集一起使用。我注意使它尽可能简单,因此可以对其进行广泛改进,添加一些一致性,例如在设置实体值之前检查列名是否存在或根据需要验证重复描述。例如,它还可以转换为 DataRow、DataTable 或 DataSet 的扩展方法。

于 2013-10-11T01:07:10.583 回答