Home > Blockchain >  How to dynamically map two class properties in C#
How to dynamically map two class properties in C#

Time:11-08

I have two applications A and B and I created another API utility between them to map the properties dynamically for every client and then send requests. I have properties mapping information in the JSON.

For example, I have two clients.

Client A want to map Employee properties of A application with B Application like below:

Application A Employee Class Application B Employee Class
FirstName LastName <---------> Name
Description <---------> Title
Title <---------> JobTitle

Client B want to map Employee properties of A application with B Application like below:

Application A Employee Class Application B Employee Class
FirstName LastName <---------> Name
Description <---------> JobTitle
Title <---------> Title

I have some other fields which need to map based on the client's requirements.

How can I achieve this? so that I just get the mapping details from the database and map them accordingly

I tried automapper ForMember method but I don't know how to pass the value from database?

CodePudding user response:

Let’s set up the scene, assuming you have the info for the client (A or B) in the Employee records.

DB Entity,

Employee:
  FirstName,
  LastName
  Description,
  Title,
  ClientId

ViewModel,

EmployeeModel:
  Name,
  Title,
  JobTitle

Create custom resolvers,

public class TitleResolver : IValueResolver<Employee, EmployeeModel, string>
{
     public string Resolve(Employee source, EmployeeModel destination, string title, ResolutionContext context)
     {
        if(source.ClienId == "A") // as an example, you could do something different.
           return source.Description;
        return source.Title;
     }
}

 public class JobTitleResolver : IValueResolver<Employee, EmployeeModel, string>
 {
     public string Resolve(Employee source, EmployeeModel destination, string title, ResolutionContext context)
     {
        if(source.ClienId == "A")
           return source.Title;
        return source.Description;
     }
 }

When you configure the mapping,

 var configuration =new MapperConfiguration(cfg => cfg.CreateMap<Employee, EmployeeModel>()
   .ForMember(dest => dest.Title, opt => opt.MapFrom<TitleResolver>())
   .ForMember(dest => dest.JobTitle, opt => opt.MapFrom<JobTitleResolver>()));

Let me know if this makes sense.

  • Related