Отображение строкового массива в объект с помощью ValueInjecter

Я ищу предложения о том, как я мог бы решить следующую проблему с помощью ValueInjecter.

ПРИМЕЧАНИЕ. Прежде чем кто-то запрыгнет, а ) скажет мне, что я делаю это неправильно или б) скажет, что я не должен использовать ValueInjecter - не делайте этого потому что а) я не имею никакого контроля над исходными данными и б) ValueInjecter используется везде в проекте, для любой другой задачи по изменению данных, поэтому использование другого инструментария на самом деле не вариант)

Эта проблема

Из набора сторонних классов обслуживания я получаю входящие данные, которые отформатированы как строковый массив с ключами. То есть мой входящий объект выглядит примерно так:

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);

Так что, если сторонняя сторона добавляет поле в свою запись, все, что мне нужно сделать, это добавить поле с таким именем в мой объект.

Прямо сейчас у меня есть пара экспериментов, которые я собираюсь попробовать, но после одного или двух дней исследований я не нашел ничего конкретного, я нашел пару сообщений о выполнении аналогичной задачи с использованием Auto-Mapper, но я не использую Auto-Mapper, так что в лучшем случае все, что я получу от них, это несколько идей (вот откуда пришли мои эксперименты).

Так что у нас это есть, у кого-нибудь есть идеи / мысли о том, как справиться с этим?

Ура Shawty

Обновление 5/5/2015

Итак, около 24 часов спустя, "Omu", создатель ValueInjecter, решает мою проблему за один раз (большое спасибо), хотя я, однако, я бы поделился подходом, с которым я играю, так как я опубликовал этот вопрос, даже если он немного неполон,

Прочитав вчера вечером разные вещи, я решил поэкспериментировать с попыткой заполнить динамический объект из строкового массива, имея в виду, что затем я могу просто ввести свойство в свойство, вводимое из анонимного / динамического объекта в мой конкретный класс.

Этот подход на самом деле сработал бы, если бы не одна проблема - "неспособность запускать методы расширения для динамических объектов". Однако кто-то из них может очень хорошо разобраться с последней частью головоломки, так что вот мой экспериментальный код, так что люди могут посмотри где мои мысли где:

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;
    }

  }
}

Я отмечаю пост Ому как ответ, потому что это решает проблему сейчас, остальное - просто пища для размышлений

1 ответ

Решение

Вам нужно сделать то же самое, что и здесь: http://valueinjecter.codeplex.com/SourceControl/latest

кроме как в вашем случае это будет KnownSourceValueInjection<string[]>

Другие вопросы по тегам