Use Operadores Implícitos 2#
Use Operadores Implícitos 2#

Salve Dev, me chamo Jorel Magatti e sou Desenvolvedor c# .Net, aqui trago uma continuação de um primeiro artigo sobre Operadores Implícitos criado pelo usuário, trago novas implementações simples porem mostrando utilização de Operador Implícito definido pelo usuário, enviando dados de um tipo de objeto para outro, a utilização mais comum, e como usar esta mesma regra com lista de objetos.
Segue abaixo link do primeiro artigo com exemplos de utilização simples:
https://joreldev.medium.com/use-operadores-impl%C3%ADcito-1–5924fbb35156
Neste exemplo trago uma controller de uma web API Asp.Net core com .Net na versão 5.0, o que normalmente seria utilizado em um cadastro de Usuários normal, no exemplo temos dois end-points, um para um cadastro individual de um único usuário e um segundo para gravar uma lista de usuários, segue abaixo exemplo :
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace API.CadastroUsuarioModel.Controllers
{
[Route("api/v1/[controller]")]
[ApiController]
public class UsuarioController : ControllerBase
{
#region POST Actions
[HttpPost]
[Route("v1/CadastroNovosUsuarios")]
public IActionResult CadastroNovosUsuarios(List<UsuarioModel> novosUsuarios)
{
List<Usuario> usuariosParaSalvar = new List<Usuario>();
if (usuariosParaSalvar.Any())
{
// os dados são passados da Lista de objeto UsuarioModel para Lista de objetos Usuario com a utilização da lista de operadores implicitos
usuariosParaSalvar = novosUsuarios.Select<UsuarioModel, Usuario>(u => u).ToList();
if (usuariosParaSalvar.Any())
{
//apos transação dos dados da model para entidade aqui estaria a chamada para o service gravar os dados
return Ok(usuariosParaSalvar);
}
}
return BadRequest("");
}
[HttpPost]
[Route("v1/CadastroNovoUsuario")]
public IActionResult CadastroNovoUsuario(UsuarioModel novoUsuario)
{
Usuario usuarioParaSalvar = new Usuario();
if (usuarioParaSalvar is not null)
{
// os dados são passados do objeto UsuarioModel para Usuario com a utilização da lista de operadores implicitos
usuarioParaSalvar = novoUsuario;
if (usuarioParaSalvar is not null)
{
//apos transação dos dados da model para entidade aqui estaria a chamada para o service gravar os dados
return Ok(usuarioParaSalvar);
}
}
return BadRequest("");
}
#endregion
}
#region Classes Modelos Exemplo
public class Usuario
{
public int Id { get; set; } = 0;
public string Nome { get; set; }
public string Sobrenome { get; set; }
public string UltimoNome { get; set; }
public int Idade { get; set; }
public string NomeCompleto { get; set; }
public string NomeUsuario { get; set; }
public string Senha { get; set; }
}
public class UsuarioModel
{
public string Nome { get; set; }
public string Sobrenome { get; set; }
public string UltimoNome { get; set; }
public int Idade { get; set; }
public string NomeUsuario { get; set; }
public string Senha { get; set; }
public static implicit operator Usuario(UsuarioModel dados)
{
return new Usuario()
{
Nome = dados.Nome,
Sobrenome = dados.Sobrenome,
UltimoNome = dados.UltimoNome,
NomeCompleto = $"{dados.Nome} {dados.Sobrenome} {dados.UltimoNome}",
Idade = dados.Idade,
NomeUsuario = dados.NomeUsuario,
Senha = dados.Senha
};
}
}
#endregion
}
Note que na mesma classe da controller, temos a declaração de duas classes de objetos (Usuario e UsuarioModel) o objetivo no exemplo é que ao receber os dados na API com o objeto UsuarioModel, façamos uma transição dos dados para o tipo de objeto Usuario (representando uma entidade, o mesmo formato utilizado em banco para gravar os dados). Neste exemplo, declaramos as classes todas em um único arquivo, somente para trazer a exemplificação unificada, não é recomendado ter classes diferentes declaradas no mesmo arquivo, segue a dica.
Note que a classe UsuarioModel já possui uma implementação de operador implicito que criamos para converter o tipo UsuarioModel para Usuario, segue abaixo:

Uma qualidade ao se utilizar conversão de operadores implícitos, é o controle na transição dos dados, onde podemos tratar determinados dados, aplicar validações e tratativas, e podemos isolar isto tudo de sua chamada, trazendo um código mais enxuto sem falar que é nativo nas ultimas versões do C#.
No end-point chamado CadastroNovoUsuario temos a chamada simples da conversão por operador implicito que declaramos, onde ele simplesmente passa a referência de um objeto do tipo UsuarioModel para Usuario, segue abaixo:

Muito simples, como dito antes isto deixa toda a transição dos dados isolados de sua chamada.
No end-point chamado CadastroNovosUsuarios temos a chamada simples da conversão por operador implicito que declaramos, porem aqui estamos usando as mesmas classes (UsuarioModel e Usuario) e trabalhando com Lista de Objetos (List<Objeto> : System.Collections.Generic) + Lambda, segue abaixo:

No exemplo acima, note que quando enviamos a lista de objeto do Tipo Usuario (List<Usuario> usuariosParaSalvar = new List<Usuario>();) chamada usuariosParaSalvar, enviamos uma referencia direta da Lista novosUsuarios do Tipo UsuarioModel (List<UsuarioModel> novosUsuarios) porem para ele aplicar a declaração do operador implicito que criamos, precisamos usar uma implementação lambda chamada .Select em sua chamada, informando os tipos que estão sofrendo a conversão entre <>:

Mesmo com a implementação lambda a chamada da conversão de tipo de operadores implícitos, é muito simples, limpa para o código e performática, muito recomendada, utilizo muito em minhas entregas e recomendo fortemente.
Espero que goste da leitura e espero que este pequeno artigo tenha lhe ajudado em sua necessidade de entrega. Abraços Dev🚀🚀🚀
Comentários
Postar um comentário