C# NetCore AutoMapper 忽略大量自动映射属性

本文介绍了如何在C# NetCore使用AutoMapper时,避免繁琐的手动忽略属性过程。通过创建一个名为NoMap的自定义属性,可以标记需要忽略的属性。在扩展方法中,检查并添加带有NoMap属性的字段到忽略列表,简化了大量属性的忽略操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一篇文章中【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方法中,我只是检查了一个属性是否有这个属性,然后将其添加到忽略列表中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csdn_aspnet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值