使用 ValueInjecter 将字符串数组映射到对象
Posted
技术标签:
【中文标题】使用 ValueInjecter 将字符串数组映射到对象【英文标题】:Mapping a string Array to an Object using ValueInjecter 【发布时间】:2015-07-16 11:55:39 【问题描述】:我正在寻找有关如何使用 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"];
(注意:这不是真实数据,只是我正在处理的模型的模型)
这里的主要前提是,要获取入站数据中的字段,我必须指定字段名称或数组索引,我无法更改它,因为提供数据的库由第三个提供不会改变事情的一方,我们的许可证不允许我改变。
每个入站数据包只包含一条记录的字段,所以如果我有多行来处理我实际拥有的是一个数组数组,但我还不担心转换它,我想解决首先只转换一条记录。
因此,我需要做的是:
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 的帖子标记为答案,因为这解决了现在的问题,剩下的只是深思
【问题讨论】:
【参考方案1】:你需要做和这里一样的事情:http://valueinjecter.codeplex.com/SourceControl/latest#DALSample/ReaderInjection.cs
除非你的情况是KnownSourceValueInjection<string[]>
【讨论】:
我能说什么,除了,你摇滚 :-) 这是一个完美的解决方案。我正在考虑编写自己的注入来解决问题,并且鉴于我收到的数据,我认为无论如何最初都是来自 DataSet,那么这就是完美的解决方案。但是,我将通过一些研究来更新我的问题。以上是关于使用 ValueInjecter 将字符串数组映射到对象的主要内容,如果未能解决你的问题,请参考以下文章
将字符串/字符数组加入带有分隔符的单个字符串 [不使用理解、映射等]