使用 ValueInjecter 将字符串数组映射到对象

Mapping a string Array to an Object using ValueInjecter

我正在寻找有关如何使用 ValueInjecter 解决以下问题的建议。

注意: 在任何人跳入之前 a) 告诉我我做错了或 b) 告诉我我不应该使用 ValueInjecter - 请不要。因为 a) 我无法控制源数据,并且 b) ValueInjecter 在项目的其他任何地方都使用,用于所有其他数据变形任务所以使用不同的工具包确实不是一种选择)

问题

从一组第 3 方服务 classes,我收到格式化为键控字符串数组的入站数据。也就是说,我的入站对象看起来像这样:

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 方向他们的记录添加一个字段,我所要做的就是向我的对象添加一个具有该名称的字段。

现在,我有几个实验要尝试,但经过一两天的研究,我没有发现任何具体的东西,我发现了几个 posts 使用 Auto-Mapper 执行类似的任务,但我没有使用 Auto-Mapper 所以我从他们那里得到的充其量只是一些想法(这就是我的实验的来源)。

所以我们知道了,有没有人ideas/thoughts知道如何解决这个问题?

干杯 美女

2015 年 7 月 5 日更新

所以大约 24 小时后,"Omu" ValueInjecter 的创建者一次性解决了我的问题(非常感谢),不过我会分享自 [=87] 以来我一直在玩弄的方法=]编辑了这个问题,尽管它有点不完整。

昨晚阅读各种内容后,我决定尝试从字符串数组中填充一个动态对象,目的是我可以进行 属性 到 属性 注入从 anonymous/dynamic 对象到我的具体 class.

除了一个问题“无法 运行 动态对象上的扩展方法。”,这种方法实际上是可行的,但是,有些人可能非常很好地解决了最后一块拼图,所以这是我的实验代码,所以人们可以看到我的想法在哪里:

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 的 post 标记为答案,因为现在问题已解决,剩下的只是 深思

您需要执行与此处相同的操作:http://valueinjecter.codeplex.com/SourceControl/latest#DALSample/ReaderInjection.cs

除非你的情况是 KnownSourceValueInjection<string[]>