<T> 使用自动映射器将容器映射到 T

  • 本文关键字:映射 c# automapper
  • 更新时间 :
  • 英文 :


我的问题与这里提出的问题非常相似,但我无法根据提供的答案找到解决方案。我一定错过了就在拐角处的东西。

我有一个自定义转换器,允许我做以下事情:

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

但是int并不是唯一的类型参数,有没有一种简洁的方式来表达:

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

提前谢谢。

如果您不介意装箱,可以使用通用转换器。

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

最新更新