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 のスクリーンショットです。 ここに画像の説明を入力

この 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 に答える