Отображение контейнера <T>в T с помощью AutoMapper - PullRequest
0 голосов
/ 02 марта 2020

Мой вопрос очень похож на заданный здесь , но я не смог найти решение на основе предоставленных ответов. Должно быть, я что-то упускаю прямо за углом.

У меня есть специальный конвертер, который позволяет мне делать следующее:

cfg.CreateMap<Container<int>, int>().ConvertUsing(new ContainerConverter<Container<int>, int>());

Но int не единственный аргумент типа, есть краткий способ express:

cfg.CreateMap<Container<T>, T>().ConvertUsing(new ContainerConverter<Container<T>, T>());

Без необходимости:

cfg.CreateMap<Container<int>, int>().ConvertUsing(new ContainerConverter<Container<int>, int>());
cfg.CreateMap<Container<long>, long>().ConvertUsing(new ContainerConverter<Container<long>, long>());
...

Для каждого T в использовании?

В моей ситуации свойства Container<T> и T в свою очередь члены классов A1, A2... и B1, B2.... Сопоставление выполняется по телефону

B dest = mapper.Map<A, B>(source);

Заранее спасибо.

1 Ответ

0 голосов
/ 03 марта 2020

Если вы не против бокса, вы можете использовать универсальный c конвертер.

static void Main(string[] args)
{
    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap(typeof(Container<>), typeof(object)).ConvertUsing(typeof(ContainerConverter<>));
    });
    config.AssertConfigurationIsValid();
    //config.BuildExecutionPlan(typeof(Destination), typeof(Source)).ToReadableString().Dump();
    var mapper = config.CreateMapper();
    mapper.Map<int>(new Container<int>{ Value = 12 }).Dump();
}
public class ContainerConverter<T> : ITypeConverter<Container<T>, object>
{
    public object Convert(Container<T> source, object destination, ResolutionContext c)
    {
        return source.Value;
    }
}
public class Container<T>
{
    public T Value { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...