AutoMapper ignora la propiedad en C#

AutoMapper ignora la propiedad en C#

AutoMapeador  Ignorar propiedad  en C# con ejemplos

En este artículo, voy a hablar sobre cómo usar la propiedad AutoMapper Ignore en C# con ejemplos Lea nuestro artículo anterior donde discutimos el AutoMapper  Asignación condicional en C# con algunos ejemplos. Al final de este artículo, comprenderá en detalle la necesidad y el uso de AutoMapper Ignore Property en C#.

¿Por qué necesitamos que AutoMapper ignore la propiedad en C#?

De forma predeterminada, AutoMapper intenta asignar todas las propiedades del tipo de origen al tipo de destino cuando los nombres de las propiedades del tipo de origen y destino son iguales. Si desea que algunas de las propiedades no se asignen con la propiedad de tipo de destino, debe usar AutoMapper Ignorar propiedad Cía#.

Nota: Si algunas de las propiedades no están disponibles en el tipo de destino, AutoMapper no generará ninguna excepción al realizar la asignación. Sin embargo, generará una excepción cuando esté utilizando ValidateMapperConfiguration() que discutiremos en nuestros próximos artículos.

Ejemplo para comprender la propiedad Ignorar de AutoMapper en C#

Veamos cómo usar la propiedad Ignorar de AutoMapper con un ejemplo. Vamos a utilizar el siguiente Empleado y EmpleadoDTO clases para esta demostración.

Nuestro requisito comercial no es asignar la propiedad de dirección es decir, necesitamos ignorar la propiedad Dirección mientras hace el mapeo entre estos dos objetos. Para hacerlo, debemos usar la Ignorar propiedad con la Dirección propiedad del tipo de destino mientras realiza la configuración del mapeador como se muestra a continuación en la imagen a continuación.

Como puede ver en el ejemplo anterior, hemos agregado el método ForMember para ignorar la propiedad Dirección mientras se realiza la asignación.

A continuación se muestra el ejemplo completo.
using System;
using AutoMapper;
namespace AutoMapperDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var mapper = InitializeAutomapper();

            Employee employee = new Employee()
            {
                ID = 101,
                Name = "James",
                Address = "Mumbai"
            };

            var empDTO = mapper.Map<Employee, EmployeeDTO>(employee);

            Console.WriteLine("After Mapping : Employee");
            Console.WriteLine("ID : " + employee.ID + ", Name : " + employee.Name + ", Address : " + employee.Address);
            Console.WriteLine();
            Console.WriteLine("After Mapping : EmployeeDTO");
            Console.WriteLine("ID : " + empDTO.ID + ", Name : " + empDTO.Name + ", Address : " + empDTO.Address);
            Console.ReadLine();
        }

        static Mapper InitializeAutomapper()
        {
            var config = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<Employee, EmployeeDTO>()

                    //Ignoring the Address property of the destination type
                    .ForMember(dest => dest.Address, act => act.Ignore());
            });

            var mapper = new Mapper(config);
            return mapper;
        }
    }

    public class Employee
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
    }

    public class EmployeeDTO
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
    }
}

Cuando ejecutamos la aplicación, nos dará el siguiente resultado.

Si observa la ventana de resultados, puede ver que el valor de la propiedad Dirección está vacío, aunque la propiedad Dirección del tipo Origen tiene valor. Entonces, AutoMapper Ignore() El método se utiliza cuando desea ignorar por completo la propiedad en la asignación. La propiedad ignorada podría estar en el objeto de origen o de destino.

La mejor manera de ignorar varias propiedades:

Pero será un procedimiento tedioso si desea ignorar varias propiedades del mapeo. Si ese es su requisito, considere crear una clase de extensión que ignorará las propiedades basadas en el atributo de datos especificado en el modelo. Analicemos el procedimiento paso a paso para implementar esto.

Paso 1:Crear un atributo NoMap

Cree una clase con el nombre NoMapAttribute heredándola de la clase System.Attribute para que podamos usar esta clase como un atributo.

Paso 2:Decora las propiedades con el atributo NoMap

Ahora, necesitas decorar el NoMap atributo con las propiedades del tipo de origen que no desea asignar con el tipo de destino. Por ejemplo, si no desea asignar la propiedad Dirección y correo electrónico, debe decorar el atributo NoMap con la propiedad Dirección y correo electrónico de la clase Empleado como se muestra en la imagen a continuación.

Paso 3:Creación de un método de extensión

Cree una clase de extensión como se muestra a continuación, que ignorará las propiedades que decorarán con el NoMap atributo. Aquí, debe importar el System.ComponentModel espacio de nombres.

Paso 4:Usar el método de extensión IgnoreNoMap

Finalmente, debe usar el método IgnoreNoMap mientras define la asignación como se muestra a continuación.

A continuación se muestra el código completo.
using System;
using System.ComponentModel;
using AutoMapper;
namespace AutoMapperDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var mapper = InitializeAutomapper();

            Employee employee = new Employee()
            {
                ID = 101,
                Name = "James",
                Address = "Mumbai"
            };

            var empDTO = mapper.Map<Employee, EmployeeDTO>(employee);

            Console.WriteLine("After Mapping : Employee");
            Console.WriteLine("ID : " + employee.ID + ", Name : " + employee.Name + ", Address : " + employee.Address + ", Email : " + employee.Email);
            Console.WriteLine();
            Console.WriteLine("After Mapping : EmployeeDTO");
            Console.WriteLine("ID : " + empDTO.ID + ", Name : " + empDTO.Name + ", Address : " + empDTO.Address + ", Email : " + empDTO.Email);
            Console.ReadLine();
        }

        static Mapper InitializeAutomapper()
        {
            var config = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<Employee, EmployeeDTO>()
                .IgnoreNoMap(); ;
            });

            var mapper = new Mapper(config);
            return mapper;
        }
    }
    
    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 Employee
    {
        public int ID { get; set; }
        public string Name { get; set; }
        [NoMap]
        public string Address { get; set; }
        [NoMap]
        public string Email { get; set; }
    }

    public class EmployeeDTO
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
        public string Email { get; set; }
    }
}

Cuando ejecutamos la aplicación, mostrará el siguiente resultado

En el ejemplo anterior, hemos creado un atributo personalizado con el nombre NoMap al heredar del Atributo clase. Luego, decoramos las propiedades que deben ignorarse del tipo de fuente con el NoMap recién creado atributo. Dentro del método de extensiones, acabamos de verificar si una propiedad tiene este NoMap atributo o no. Si la propiedad está decorada con el NoMap entonces agregamos esa propiedad a la lista ignorada.

En el próximo artículo, voy a discutir el uso de UseValue, ResolveUsing y Null Substitution usando AutoMapper en C# con ejemplos Aquí, en este artículo, trato de explicar la Propiedad de Ignorar de AutoMapper en C# con algunos ejemplos. Espero que este AutoMapper ignore la propiedad en C# artículo le ayudará con su necesidad. Me gustaría tener sus comentarios. Publique sus comentarios, preguntas o comentarios sobre este artículo.