Skip to content

Instantly share code, notes, and snippets.

@VictorSDK
Forked from yemrekeskin/ObjectMapper.cs
Last active July 30, 2021 21:21
Show Gist options
  • Save VictorSDK/3f783323bb4a06a91df1cecddd3a5d19 to your computer and use it in GitHub Desktop.
Save VictorSDK/3f783323bb4a06a91df1cecddd3a5d19 to your computer and use it in GitHub Desktop.
using Automapper vs Custom Object Mapper(with reflection) vs Manual Mapper for data transformation of objects
using System;
using System.Diagnostics;
using System.Reflection;
using AutoMapper;
public class BaseModel
{
public Guid Id { get; set; }
public DateTime CreateDate { get; set; }
public bool IsActive { get; set; }
public string LastUpdatingUserName { get; set; }
public DateTime LastUpdatingDate { get; set; }
}
public class BaseViewModel
{
public Guid Id { get; set; }
}
public class Product
: BaseModel
{
public string Name { get; set; }
public decimal Price { get; set; }
public string Description { get; set; }
public int Stock { get; set; }
}
public class ProductViewModel
: BaseViewModel
{
public string Name { get; set; }
public decimal Price { get; set; }
public string Description { get; set; }
public int Stock { get; set; }
}
//Helper class for object mapping
public static class ObjectMap
{
public static TViewModel MapViewModelToModel<TViewModel>(this BaseModel model, TViewModel viewModel)
where TViewModel : class
{
if (model == null || viewModel == null)
return null;
Type ModelObjectType = model.GetType();
PropertyInfo[] modelPropList = ModelObjectType.GetProperties();
Type ViewModelType = viewModel.GetType();
PropertyInfo[] viewModelPropList = ViewModelType.GetProperties();
foreach (PropertyInfo modelPropInfo in modelPropList)
{
foreach (PropertyInfo viewModelPropInfo in viewModelPropList)
{
if (modelPropInfo.Name == viewModelPropInfo.Name &&
!modelPropInfo.GetGetMethod().IsVirtual && !viewModelPropInfo.GetGetMethod().IsVirtual)
{
viewModelPropInfo.SetValue(viewModel, modelPropInfo.GetValue(model, null), null);
break;
}
}
}
return viewModel;
}
}
// let's use our codes :D
class Program
{
static void Main(string[] args)
{
Product product = new Product
{
Id = Guid.NewGuid(),
CreateDate = DateTime.Now,
LastUpdatingDate = DateTime.Now,
Description = "Description",
IsActive = false,
LastUpdatingUserName = "YUNUSEMR",
Name = "IPHONE 5",
Price = 2000,
Stock = 13
};
#region data transformation with AutoMapper
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<Product, ProductViewModel>();
});
IMapper mapper = config.CreateMapper();
var sw = Stopwatch.StartNew();
// can define in bootstrapper class
ProductViewModel productViewModel = mapper.Map<Product, ProductViewModel>(product);
sw.Stop();
Console.WriteLine("Elapsed time 1 :>" + sw.Elapsed.TotalMilliseconds);
Console.WriteLine("with AutoMapper " + productViewModel.Description + " - " + productViewModel.Name);
#endregion
#region data transformation with Reflection
var sw1 = Stopwatch.StartNew();
sw1.Start();
ProductViewModel productViewModel1 = new ProductViewModel();
ObjectMap.MapViewModelToModel<ProductViewModel>(product, productViewModel1);
sw1.Stop();
Console.WriteLine("Elapsed time 2 :>" + sw1.Elapsed.TotalMilliseconds);
Console.WriteLine("with Reflection " + productViewModel1.Description + " - " + productViewModel1.Name);
#endregion
#region data transformation manual
var sw2 = Stopwatch.StartNew();
sw2.Start();
/*ProductViewModel productViewModel2 = new ProductViewModel()
{
Description = product.Description,
Id = product.Id,
Name = product.Name,
Price = product.Price,
Stock = product.Stock
};*/
ProductViewModel productViewModel2 = new ProductViewModel();
productViewModel2.Description = product.Description;
productViewModel2.Id = product.Id;
productViewModel2.Name = product.Name;
productViewModel2.Price = product.Price;
productViewModel2.Stock = product.Stock;
sw2.Stop();
Console.WriteLine("Elapsed time 3 :>" + sw2.Elapsed.TotalMilliseconds);
Console.WriteLine("with Manual Mapper " + productViewModel1.Description + " - " + productViewModel1.Name);
#endregion
Console.ReadLine();
}
}
/*
Results
Elapsed time 1 :>107.7419
with AutoMapper Description - IPHONE 5
Elapsed time 2 :>2.5482
with Reflection Description - IPHONE 5
Elapsed time 3 :>0.0085
with Manual Mapper Description - IPHONE 5
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment