AutoMapper是可以实现Deep copy的。默认是相同的属性名复制过去。
如果有不一样的属性名需要拷贝,可以通过定义自己的规则就行Mapping。
使用实例(转载):
public class Employee
{
public string Name { get; set; }
public string Email { get; set; }
public Address Address { get; set; }
public string Position { get; set; }
public bool Gender { get; set; }
public int Age { get; set; }
public int YearsInCompany { get; set; }
public DateTime StartDate { get; set; }
}
public class Address
{
public string Country { get; set; }
public string City { get; set; }
public string Street { get; set; }
public int Number { get; set; }
}
public class EmployeeViewItem
{
public string Name { get; set; }
public string Email { get; set; }
public string Address { get; set; }
public string Position { get; set; }
public string Gender { get; set; }
public int Age { get; set; }
public int YearsInCompany { get; set; }
public string StartDate { get; set; }
}
普通做法:
EmployeeViewItem viewItem = new EmployeeViewItem();
viewItem.Name = employee.Name;
viewItem.Email = employee.Email;
viewItem.Address = employee.Address.City + employee.Address.Street + employee.Address.Number;
viewItem.Position = employee.Position;
viewItem.Gender = employee.Gender == true ? "Man" : "Female";
viewItem.Age = employee.Age;
viewItem.YearsInCompany = employee.YearsInCompany;
viewItem.StartDate = employee.StartDate.ToShortDateString();
用AutoMapper之后:
Mapper.CreateMap<Employee, EmployeeViewItem>();
EmployeeViewItem employeeViewItem = Mapper.Map<Employee, Employee>(employee);
以上只需两句话非常简洁,但是需要配置Mapping的方法
class Program
{
static void Main(string[] args)
{
Mapper.CreateMap<Employee, EmployeeViewItem>()
.ForMember(ev => ev.Address,
m => m.MapFrom(a => a.Address.City + ", " +
a.Address.Street + " " +
a.Address.Number)
)
.ForMember(ev => ev.Gender,
m => m.ResolveUsing<GenderResolver>().FromMember(e => e.Gender))
.ForMember(ev => ev.StartDate, m => m.AddFormatter<DateFormatter>());
Employee employee = new Employee
{
Name = "John SMith",
Email = "john@codearsenal.net",
Address = new Address
{
Country = "USA",
City = "New York",
Street = "Wall Street",
Number = 7
},
Position = "Manager",
Gender = true,
Age = 35,
YearsInCompany = 5,
StartDate = new DateTime(2007, 11, 2)
};
EmployeeViewItem employeeVIewItem = Mapper.Map<Employee, EmployeeViewItem>(employee);
}
public class GenderResolver : ValueResolver<bool, string>
{
protected override string ResolveCore(bool source)
{
return source ? "Man" : "Female";
}
}
public class DateFormatter : IValueFormatter
{
public string FormatValue(ResolutionContext context)
{
return ((DateTime)context.SourceValue).ToShortDateString();
}
}
}
EmployViewItem的结果如下:
还有些更加深入和详细的用法可以参照下面的链接
http://www.cnblogs.com/youring2/p/automapper.html