在上一篇文章中【C# NetCore AutoMapper 忽略映射属性https://blog.youkuaiyun.com/hefeng_aspnet/article/details/124754567】,在创建映射时,我添加了FormMember方法,以便在进行映射时忽略Name属性。如果查看输出窗口,可以看到Name的值为空,即使源实例中的属性中有值。
如果我们想忽略大量自动映射的属性,这将是一个繁琐的过程。因此,如果遇到这种情况,请考虑创建一个类似下面的扩展类,它会忽略基于模型中指定的数据属性的属性。
完整示例:
using System;
using AutoMapper;
using System.ComponentModel;
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
[NoMap]
public string Address { get; set; }
[NoMap]
public string Email { get; set; }
}
public class PersonVM
{
public string Name { get; set; }
public int Age { get; set; }
public string Address { get; set; }
public string Email { get; set; }
}
public class NoMapAttribute : System.Attribute
{
}
public static class IgnoreNoMapExtensions
{
public static IMappingExpression<TSource, TDestination> IgnoreNoMap<TSource, TDestination>(
this IMappingExpression<TSource, TDestination> expression)
{
var sourceType = typeof(TSource);
foreach (var property in sourceType.GetProperties())
{
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(sourceType)[property.Name];
NoMapAttribute attribute = (NoMapAttribute) descriptor.Attributes[typeof(NoMapAttribute)];
if(attribute != null)
expression.ForMember(property.Name, opt => opt.Ignore());
}
return expression;
}
}
public class Program
{
public static void Main()
{
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<Person, PersonVM>().IgnoreNoMap();
});
IMapper mapper = config.CreateMapper();
var person = new Person { Name="test", Age=10, Email = "test@test.com", Address="Test Address" };
var personVM = mapper.Map<PersonVM>(person);
Console.WriteLine("\nperson.Name : {0} \nperson.Age : {1} \nperson.Address : {2} \nperson.Email : {3}", person.Name, person.Age, person.Email, person.Address);
Console.WriteLine("\npersonVM.Name : {0} \npersonVM.Age : {1} \nperson.Address : {2} \nperson.Email : {3}", personVM.Name, personVM.Age, personVM.Email, personVM.Address);
}
}
在本例中,我通过继承属性类创建了一个名为NoMap的空自定义属性。之后,我用新创建的属性[NoMap]修饰了源类中需要忽略的属性。然后在extensions方法中,我只是检查了一个属性是否有这个属性,然后将其添加到忽略列表中。