我正在寻找有关如何使用 ValueInjecter 解决以下问题的建议。
注意:在任何人介入之前a)告诉我我做错了或b)告诉我不应该使用 ValueInjecter - 请不要。因为a)我无法控制源数据b) ValueInjecter 在项目的其他任何地方都使用,对于所有其他数据变形任务,因此使用不同的工具包确实不是一种选择)
问题
从一组 3rd 方服务类中,我接收到格式化为键控字符串数组的入站数据。也就是说,我的入站对象看起来像这样:
var inboundData = string[];
var field1 = inboundData["field1"];
var field2 = inboundData["field2"];
var field3 = inboundData["field3"];
var field4 = inboundData["field4"];
(注意:这不是真实数据,只是我正在处理的模型)
这里的主要前提是,要获取入站数据中的字段,我必须指定字段名称或数组索引,我无法更改它,因为提供数据的库是由获胜的第 3 方提供的'不要改变事情,我们的许可证不允许我改变。
每个入站数据包只包含一条记录的字段,所以如果我有多行来处理我实际拥有的是一个数组数组,但我还不担心转换它,我只想处理转换一个先单条记录。
因此,我需要做的是:
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 执行此操作,以便在更改任何字段名称时自动将数组键["blah"]映射到对象属性blah 。
当前的解决方案
目前,数据已被转换,但使用的是老式方法:
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);
因此,如果第 3 方将一个字段添加到他们的记录中,我所要做的就是将该名称的字段添加到我的对象中。
现在,我有几个要尝试的实验,但是经过一两天的研究,我没有发现任何具体的东西,我发现了几个使用 Auto- 执行类似任务的帖子Mapper,但我没有使用 Auto-Mapper,所以我从他们那里得到的充其量只是一些想法(这就是我的实验的来源)。
所以我们有了它,那里的任何人对如何解决这个问题有任何想法/想法?
干杯肖蒂
2015 年 7 月 5 日更新
所以大约 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 的帖子标记为答案,因为现在解决了问题,其余的只是深思熟虑