Отображение строкового массива в объект с помощью 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[]>