簡體   English   中英

使用ValueInjecter將字符串數組映射到對象

[英]Mapping a string Array to an Object using ValueInjecter

我正在尋找有關如何使用ValueInjecter解決以下問題的建議。

注意:在任何人跳進來之前, a)告訴我我做錯了,或者b)告訴我我不應該使用ValueInjecter-請不要。 因為a)我無法控制源數據,並且b) ValueInjecter在項目中的其他任何地方都用於其他所有數據變形任務,因此使用其他工具包實在不是一種選擇)

問題

從一組第三方服務類中,我收到入站數據,該入站數據的格式設置為鍵控字符串數組。 也就是說,我的入站對象看起來像這樣:

var inboundData  = string[];
var field1 = inboundData["field1"];
var field2 = inboundData["field2"];
var field3 = inboundData["field3"];
var field4 = inboundData["field4"];

注意:這不是真實數據,只是我正在處理的模型

這里的主要前提是,要獲取入站數據中的某個字段,我要么必須指定一個字段名稱,要么要指定一個數組索引,因為提供數據的庫由第三方提供,所以我無法更改它不能更改,而我們的許可證不允許我更改。

每個入站數據包僅包含一個記錄的字段,因此,如果我要處理多行實際上是一個數組數組,但我現在不擔心要轉換,我只想處理一個單一記錄優先。

因此,我需要做的是:

var inboundData  = string[];
var field1 = inboundData["field1"];
var field2 = inboundData["field2"];
var field3 = inboundData["field3"];
var field4 = inboundData["field4"];

並將其轉換為:

public class inboundData
{
  public string field1 { get; set; }
  public string field2 { get; set; }
  public string field3 { get; set; }
  public string field4 { get; set; }
}

如果可能的話,我想,這樣陣列鍵[“嗒嗒”]映射等等自動應任何字段名稱更改為對象屬性要能做到這一點使用ValueInjecter。

當前解決方案

目前,數據已轉換,但使用的是以下老式方法:

var inboundData = inboundService.GetNextRecord();
InboudDataObject = new InboundDataObject
{
  field1 = inboundData["field1"],
  field2 = inboundData["field2"],
  field3 = inboundData["field3"],
  field4 = inboundData["field4"]
}

盡管這行得通,但將來還會出現問題,因為以前做過此事的任何人都將知道這是一場等待維護的噩夢。

因此,我希望能夠執行以下操作:

var inboundData = inboundService.GetNextRecord();
InboudDataObject = new InboundDataObject().InjectFrom(inboundData);

這樣,如果第三方在其記錄中添加一個字段,我要做的就是在我的對象中添加一個具有該名稱的字段。

目前,我有幾個實驗要嘗試,但是經過一兩天的研究后,我還沒有做任何具體的事情,我發現了幾篇關於使用Auto- Mapper,但是我沒有使用Auto-Mapper,所以充其量我只能從中獲得一些想法(這是我的實驗所來自的地方)。

因此,我們有了它,外面的任何人都對如何解決這一問題有任何想法/想法?

干杯

更新7/5/2015

因此,大約24小時后,ValueInjecter的創建者“ Omu”一口氣解決了我的問題(非常感謝),盡管我會分享我自發布此問題以來一直在嘗試的方法,即使它有點不完整。

在昨晚閱讀了各種內容之后,我決定嘗試嘗試從字符串數組填充動態對象,以期可以將屬性從匿名/動態對象注入到我的具體類中。

除了一個問題“ 無法在動態對象上運行擴展方法。 ”之外,這種方法實際上是行得通的但是,那里的某個人很可能會弄清楚難題的最后一部分,所以這是我的實驗代碼,因此人們可以看看我的想法在哪里:

using System.Collections.Generic;
using System.Dynamic;
using Omu.ValueInjecter;

namespace dynamic_mapping_test
{
  public class DestinationObject
  {
    public string field1 { get; set; }
    public int field2 { get; set; }
    public string[] field3 { get; set; }
    public bool field4 { get; set; }
    public double field5 { get; set; }
  }

  class Program
  {
    private static Dictionary<string, object> sourceData = new Dictionary<string, object>();

    static void Main()
    {
      sourceData["field1"] = "A person";
      sourceData["field2"] = 20;
      sourceData["field3"] = new string[] {"A thing", "A thing"};
      sourceData["field4"] = false;
      sourceData["field5"] = 999.999;

      var eo = new ExpandoObject();
      var eoCollection = (ICollection<KeyValuePair<string, object>>) eo;

      foreach (var inputObject in sourceData)
      {
        eoCollection.Add(inputObject);
      }

      dynamic eoDynamic = eo;

      DestinationObject myObject = new DestinationObject().InjectFrom((object)eoDynamic) as DestinationObject;
    }

  }
}

我將Omu的帖子標記為答案,因為這已經解決了問題,其余的只是思考

您需要執行以下操作: http : //valueinjecter.codeplex.com/SourceControl/latest#DALSample/ReaderInjection.cs

除了您的情況,它將是KnownSourceValueInjection<string[]>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM