使用自动映射器将单个对象映射到对象列表
use automapper to map single object into a list of objects
我的映射器中有以下行:
我正在尝试从一个模型映射到一个模型,其中我有一个名为 Result 的 属性 到我有一个结果列表的模型。
到目前为止我有以下内容:
options.CreateMap<Contract.Dto.Result, List<Result>>(MemberList.Source).ConvertUsing<ResultConverter>();
internal class ResultConverter : ITypeConverter<Contract.Dto.Result, List<Result>>
{
public List<Result> Convert(Contract.Dto.Result source, List<Result> destination, ResolutionContext context)
{
destination.Add(context.Mapper.Map<Contract.Dto.Result, Result>(source));
return destination;
}
}
但是,在调试时,ResultConverter 永远不会命中。
关于如何从单个对象映射到对象列表,有没有人有任何解决方案?此对象列表中永远只有一个对象,但其他限制阻止我修改模型。
我从来没有用过automapper。您可以试试这个,如果有效请告诉我:
//Use this method.
public void Map(object PreEqual, string PreEqProperty, object PostEqual, string PostEqProperty)
{
PreEqual.GetType().GetProperty(PreEqProperty).SetValue(PreEqual, PostEqual.GetType().GetProperty(PostEqProperty).GetValue(PostEqual, null), null);
}
//Use Map method somewhere you want, like this:
//myRefObj is your source object and myRefProp is its property that you want to map to other objects.
foreach(SomeType item in CollectionOfSomeType)
{
Map(item, "myRefProp", myRefObj, "myRefProp");
}
我认为它适用于基本类型。你能试试让我知道它是否有效吗?
我设法在我创建的一个非常小的 Class 库中实现了它。我注意到可能会破坏您的代码的位:
不要在任何地方提及您也在映射 < Contract.Dto.Result,结果 > - 确保您已添加这两个映射
var config = new MapperConfiguration(options =>
{
options.CreateMap<Contract.Dto.Result, List<Result>>(MemberList.Source).ConvertUsing<ResultConverter>();
options.CreateMap<Contract.Dto.Result, Result>(MemberList.Source);
});
在您的转换器中,我将其更改为使用新的结果列表而不是目标
public List<Result> Convert(Contract.Dto.Result source, List<Result> destination, ResolutionContext context)
{
var listOfResults = new List<Result>();
var result = context.Mapper.Map<Contract.Dto.Result, Result>(source);
listOfResults.Add(result);
return listOfResults;
}
实际使用地图时,请确保您的语法正确
var result = new Contract.Dto.Result();
var expected = mapper.Map<List<Result>>(result);
此外,如果使用 IOC,请确保您已注册转换器。下面的 Autofac 代码示例
builder.RegisterType<ResultConverter>().AsSelf();
builder.Register(context => new MapperConfiguration(options=>
{
options.CreateMap<Contract.Dto.Result, List<Result>>(MemberList.Source).ConvertUsing<ResultConverter>();
options.CreateMap<Contract.Dto.Result, Result>(MemberList.Source);
})).AsSelf().SingleInstance();
builder.Register(c =>
{
//This resolves a new context that can be used later.
var context = c.Resolve<IComponentContext>();
var config = context.Resolve<MapperConfiguration>();
return config.CreateMapper(context.Resolve);
}).As<IMapper>().InstancePerLifetimeScope();
正如下面评论中提到的 OP,还要确保使用正确的类型,在本例中是 List<> vs IList<>
在您的项目中尝试每一种方法,希望这能解决您的问题。如果没有告诉我,我可以进一步查看。
我的映射器中有以下行:
我正在尝试从一个模型映射到一个模型,其中我有一个名为 Result 的 属性 到我有一个结果列表的模型。
到目前为止我有以下内容:
options.CreateMap<Contract.Dto.Result, List<Result>>(MemberList.Source).ConvertUsing<ResultConverter>();
internal class ResultConverter : ITypeConverter<Contract.Dto.Result, List<Result>>
{
public List<Result> Convert(Contract.Dto.Result source, List<Result> destination, ResolutionContext context)
{
destination.Add(context.Mapper.Map<Contract.Dto.Result, Result>(source));
return destination;
}
}
但是,在调试时,ResultConverter 永远不会命中。 关于如何从单个对象映射到对象列表,有没有人有任何解决方案?此对象列表中永远只有一个对象,但其他限制阻止我修改模型。
我从来没有用过automapper。您可以试试这个,如果有效请告诉我:
//Use this method.
public void Map(object PreEqual, string PreEqProperty, object PostEqual, string PostEqProperty)
{
PreEqual.GetType().GetProperty(PreEqProperty).SetValue(PreEqual, PostEqual.GetType().GetProperty(PostEqProperty).GetValue(PostEqual, null), null);
}
//Use Map method somewhere you want, like this:
//myRefObj is your source object and myRefProp is its property that you want to map to other objects.
foreach(SomeType item in CollectionOfSomeType)
{
Map(item, "myRefProp", myRefObj, "myRefProp");
}
我认为它适用于基本类型。你能试试让我知道它是否有效吗?
我设法在我创建的一个非常小的 Class 库中实现了它。我注意到可能会破坏您的代码的位:
不要在任何地方提及您也在映射 < Contract.Dto.Result,结果 > - 确保您已添加这两个映射
var config = new MapperConfiguration(options =>
{
options.CreateMap<Contract.Dto.Result, List<Result>>(MemberList.Source).ConvertUsing<ResultConverter>();
options.CreateMap<Contract.Dto.Result, Result>(MemberList.Source);
});
在您的转换器中,我将其更改为使用新的结果列表而不是目标
public List<Result> Convert(Contract.Dto.Result source, List<Result> destination, ResolutionContext context)
{
var listOfResults = new List<Result>();
var result = context.Mapper.Map<Contract.Dto.Result, Result>(source);
listOfResults.Add(result);
return listOfResults;
}
实际使用地图时,请确保您的语法正确
var result = new Contract.Dto.Result();
var expected = mapper.Map<List<Result>>(result);
此外,如果使用 IOC,请确保您已注册转换器。下面的 Autofac 代码示例
builder.RegisterType<ResultConverter>().AsSelf();
builder.Register(context => new MapperConfiguration(options=>
{
options.CreateMap<Contract.Dto.Result, List<Result>>(MemberList.Source).ConvertUsing<ResultConverter>();
options.CreateMap<Contract.Dto.Result, Result>(MemberList.Source);
})).AsSelf().SingleInstance();
builder.Register(c =>
{
//This resolves a new context that can be used later.
var context = c.Resolve<IComponentContext>();
var config = context.Resolve<MapperConfiguration>();
return config.CreateMapper(context.Resolve);
}).As<IMapper>().InstancePerLifetimeScope();
正如下面评论中提到的 OP,还要确保使用正确的类型,在本例中是 List<> vs IList<>
在您的项目中尝试每一种方法,希望这能解决您的问题。如果没有告诉我,我可以进一步查看。