[英]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,所以充其量我只能從中獲得一些想法(這是我的實驗所來自的地方)。
因此,我們有了它,外面的任何人都對如何解決這一問題有任何想法/想法?
干杯
因此,大約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.