我正在寻找有关如何使用ValueInjecter解决以下问题的建议。
注意:在任何人跳入之前 a)告诉我我做错了或 b)告诉我我不应该使用ValueInjecter - 请不要。 beacuse a)我无法控制源数据和 b) ValueInjecter用于项目中的其他任何位置,用于其他每个数据变形任务,因此使用不同的工具包实际上是不是一种选择)
从一组第三方服务类中,我收到格式化为键控字符串数组的入站数据。也就是说,我的入站对象看起来像这样:
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);
因此,如果第三方在他们的记录中添加一个字段,我所要做的就是在我的对象中添加该名称的字段。
现在,我将尝试一些实验,但经过一天或两年的研究后,我没有发现任何具体内容,我发现了一些执行类似任务的帖子使用自动映射器,但我没有使用自动映射器,所以我从他们那里得到的只是一些想法(这就是我的实验来自的地方)。
所以我们拥有它,那里的任何人对如何解决这个问题都有任何想法/想法?
干杯 美女
所以大约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的帖子标记为答案,因为现在解决了问题,其余的只是思考的食物
答案 0 :(得分:0)
你需要做同样的事情:http://valueinjecter.codeplex.com/SourceControl/latest#DALSample/ReaderInjection.cs
除了您的情况,它将是KnownSourceValueInjection<string[]>