amp
amp

Reputation: 12382

Dynamic mapping using AutoMapper

I have two classes:

public class ClassA
{
    public ClassA()
    {
        LanguageInfo = new List<ClassALanguage>();
    }
    public long ID { get; set; }
    public string Value { get; set; }
    public List<ClassALanguage> LanguageInfo { get; set; }
}

public class ClassALanguage
{
    public long ID { get; set; }
    public string Name { get; set; }
    public string Language { get; set; }
}

And I have a destination class:

public class WSClassA
{
    public long ID { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}

So I thought I could configure the mapping like this:

Mapper.CreateMap<ClassA, WSClassA>()
        .ForMember(
            ws => ws.Name,
            opt => opt.MapFrom(clsA => clsA.LanguageInfo.Find(lg => lg.Language == languageSelected).Name));

The problem is after the first time the mapping is executed, it is not able to change. Even if the CreateMap() is executed with another value for languageSelected, the binding works as the first time.

Is there any solution to accomplish that?

Upvotes: 1

Views: 1339

Answers (1)

Paul
Paul

Reputation: 703

In your case you need some context when you perform your mapping - the selected language.

Instead of using MapFrom use the ResolveUsing method with a custom IValueResolver.
See - https://automapper.codeplex.com/wikipage?title=Custom%20Value%20Resolvers

When you make your .Map call use the overload which allows you to modify the IMappingOperationOptions. Set the language you want to compare against in the interfaces Items collection.

Finally in your custom IValueResolver's Resolve method you can access those items via ResolutionResult.Context.Options.Items property.

Upvotes: 1

Related Questions