Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Duvida sobre Record

public record DadosDto(string Nome, string Sobrenome)
{
    public string Endereco { get; set; }
    public int Idade { get; set; }
}

é possivel adicionar uma logica para Record qd uma propriedade por exemplo no campo idade ter dentro dela uma logica para receber a data de nascimento, pegar a data atual e dai devovler a idade da data de nascimento que seria imutavel. Outra coisa é se enum deve ser usado como propriedade em um record por exemplo se fosse:

public record DadosDto(string Valor, Categoria Categoria)
{
    public DadosDto(decimal valor)
    {
        Valor = valor;
        Categoria = valor > 0 ? Categoria.Receita : Categoria.Despesa
    }
}

Nesse caso nao sei se devo por da forma anterior, visto que se eu for fzr um Map por exemplo eu ia querer que mapeasse apenas o Valor e a Categoria fosse com base no valor sendo ambos imutaveis e levando em conta que o record precisaria de um construtor vazio para acesso a bancos de dados essa coisas.

1 resposta
solução!

Olá, Luccas.

Tudo bem?

1. Lógica na Propriedade Idade para Calcular a Idade com Base na Data de Nascimento

Para calcular a idade com base na data de nascimento e garantir que a propriedade seja imutável, você pode usar uma propriedade calculada. Veja como você pode fazer isso:

public record DadosDto(string Nome, string Sobrenome, DateTime DataNascimento)
{
    public string Endereco { get; init; }
    
    public int Idade => DateTime.Now.Year - DataNascimento.Year - 
                        (DateTime.Now.DayOfYear < DataNascimento.DayOfYear ? 1 : 0);
}

Neste exemplo, Idade é uma propriedade calculada que não pode ser alterada diretamente, garantindo a imutabilidade.

2. Uso de enum como Propriedade em um record

Você pode usar enum como propriedade em um record, e é possível definir a lógica no construtor para determinar o valor da enumeração com base em outra propriedade. No entanto, lembre-se de que, para manter a imutabilidade, as propriedades devem ser init ou somente leitura.

Aqui está um exemplo de como você pode fazer isso:

public enum Categoria
{
    Receita,
    Despesa
}

public record DadosDto(decimal Valor)
{
    public Categoria Categoria { get; init; } = Valor > 0 ? Categoria.Receita : Categoria.Despesa;
}

Neste exemplo, Categoria é inicializada com base no valor de Valor e não pode ser alterada após a criação do objeto.

Construtor Vazio para Acesso a Bancos de Dados

Se você precisar de um construtor vazio para acesso a bancos de dados, você pode usar um record class em vez de um record padrão, pois ele permite a definição de um construtor vazio. No entanto, isso pode comprometer a imutabilidade, então use com cuidado.

public record class DadosDto
{
    public string Nome { get; init; }
    public string Sobrenome { get; init; }
    public string Endereco { get; init; }
    public DateTime DataNascimento { get; init; }
    
    public int Idade => DateTime.Now.Year - DataNascimento.Year - 
                        (DateTime.Now.DayOfYear < DataNascimento.DayOfYear ? 1 : 0);
    
    public DadosDto() { } // Construtor vazio para ORM

    public DadosDto(string nome, string sobrenome, DateTime dataNascimento)
    {
        Nome = nome;
        Sobrenome = sobrenome;
        DataNascimento = dataNascimento;
    }
}

Seria isso? Espero ter ajudado. Qualquer coisa manda aqui de novo.

Bons estudos!