簡體   English   中英

使用自動映射器將單個對象映射到對象列表

[英]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。 關於如何從單個對象映射到對象列表,有人可以解決嗎? 在該對象列表中將永遠只有一個對象,但是其他約束阻止我修改模型。

我設法使它在我創建的很小的類庫中工作。 我注意到的一些位可能會破壞您的代碼:

在要映射<Contract.Dto.Result,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 <>

嘗試一下每個項目,希望能解決您的問題。 如果不能,請與我聯系。

我從未使用過自動映射器。 您可以嘗試一下,如果有效,請告訴我:

        //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");
        }    

我認為它將適用於原始類型。 您可以嘗試讓我知道是否可行嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM