C# 使用automapper将单个对象映射到对象列表中

C# 使用automapper将单个对象映射到对象列表中,c#,automapper,C#,Automapper,我的映射器中有以下行: 我试图从一个有一个名为Result的属性的模型映射到一个有结果列表的模型 到目前为止,我有以下几点: options.CreateMap<Contract.Dto.Result, List<Result>>(MemberList.Source).ConvertUsing<ResultConverter>(); internal class ResultConverter : ITypeConverter<Contract.Dt

我的映射器中有以下行:

我试图从一个有一个名为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;
        }
    }
options.CreateMap(MemberList.Source).ConvertUsing();
内部类ResultConverter:ITypeConverter
{
公共列表转换(Contract.Dto.Result源、列表目标、ResolutionContext上下文)
{
Add(context.Mapper.Map(source));
返回目的地;
}
}
但是,在调试时,决不会命中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");
        }    

我认为它将适用于基本类型。你能试着告诉我它是否有效吗?

我已经设法在我创建的一个非常小的类库中实现了这一点。我注意到可能会破坏您的代码的位:

在任何地方都不要提及您也在映射-确保已添加这两个映射

var config = new MapperConfiguration(options =>
{
    options.CreateMap<Contract.Dto.Result, List<Result>>(MemberList.Source).ConvertUsing<ResultConverter>();
    options.CreateMap<Contract.Dto.Result, Result>(MemberList.Source);
});
var config=new-MapperConfiguration(选项=>
{
options.CreateMap(MemberList.Source).ConvertUsing();
options.CreateMap(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;
}
公共列表转换(Contract.Dto.Result源、列表目标、ResolutionContext上下文)
{
var listOfResults=新列表();
var result=context.Mapper.Map(源);
结果列表。添加(结果);
返回结果列表;
}
在实际使用映射时,只需确保使用了正确的语法即可

var result = new Contract.Dto.Result();
var expected = mapper.Map<List<Result>>(result);
var result=new Contract.Dto.result();
var expected=mapper.Map(结果);
此外,如果使用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();
builder.RegisterType().AsSelf();
注册(上下文=>新的MapperConfiguration(选项=>
{
options.CreateMap(MemberList.Source).ConvertUsing();
options.CreateMap(MemberList.Source);
})).AsSelf().SingleInstance();
builder.Register(c=>
{
//这将解析一个可以稍后使用的新上下文。
var context=c.Resolve();
var config=context.Resolve();
返回config.CreateMapper(context.Resolve);
}).As().InstancePerLifetimeScope();
正如下面注释中提到的,还要确保在这个实例列表vs IList中使用了正确的类型


在你的项目中尝试一下这些方法,希望能解决你的问题。如果不让我知道,我可以进一步查看。

谢谢您的回复,但这是一个特别的automapper问题。如果列表中总是只有一个,为什么它是一个列表?您可以将属性修改为列表中的结果吗?您使用的是哪个版本的automapper?@lowry0031不,我无法更改模型。就是这样。@andyb952 automapper版本8.0.0另外,您是否在IOC容器中注册了转换器(如果使用)?我今天会看一看这个,因为我刚刚使用了一个转换器,有同样的问题,但它工作了。谢谢,非常感谢你花时间。我有你在顶部提到的映射,你在底部提到的调用是正确的。我已经更改了我的转换,以符合您的建议,但不幸的是,我没有更改。是否有任何方法可以在不使用转换类的情况下执行此操作?您是否使用任何类型的IOC,如autofac或ninject?不,我很确定这是唯一的方法,他们绝对是使用温莎城堡的最佳选择。我开始认为Converter类甚至没有受到攻击。例如,在调试时,调试器从不输入castle windor未使用的代码,但我知道我对autofac有问题。我需要注册转换器。在上面添加了autofac代码,请确保已注册