2

我正在寻找有关如何使用 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 的帖子标记为答案,因为现在解决了问题,其余的只是深思熟虑

4

1 回答 1

1

你需要做和这里一样的事情:http: //valueinjecter.codeplex.com/SourceControl/latest#DALSample/ReaderInjection.cs

除了你的情况KnownSourceValueInjection<string[]>

于 2015-05-07T03:27:28.957 回答