4
respostas

Manipular um tipo genérico

É possível enviar um parâmetro do tipo ContaCorrente, por exemplo, para um método que espera um tipo genérico T, e dentro deste método utilizar T como ContaCorrente?

4 respostas

Olá Philippe, tudo certo?

Pode sim! O que determina qual tipo é aceito, é o tipo declarado na construção do objeto. Você poderia fazer:

Lista<ContaCorrente> listaDeContaCorrente = new Lista<ContaCorrente>();

E para popular a lista, só é aceitável valores que correspondem a uma ContaCorrente.

Bons estudos!

Olá, Philippe, tudo bem?

Fiz um exemplo simples de um método genérico só para complementar a explicação anterior.

using System;

namespace ConsoleApp1
{
    public class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            var conta = new ContaCorrente()
            {
                Saldo = 1000
            };

            var conta2 = new ContaCorrente()
            {
                Saldo = 10
            };

            conta.Soma(conta2);

            Console.WriteLine(conta.Saldo);

            Console.ReadKey();
        }

    }

    public class ContaCorrente
    {
        public double Saldo { get; set; }

        public void Soma<T>(T obj)
        {
            ContaCorrente conta2 = obj as ContaCorrente;

            if (conta2 != null)
            {
                this.Saldo = this.Saldo + conta2.Saldo;
            }
            else
            {
                throw new ArgumentException("Parametro com tipo inválido");
            }
        }
    }
}

Então, na verdade eu queria fazer algo um pouco mais fora de linha. Eu queria enviar um Tipo para um método que vive em outro Projeto, que representa uma camada Anticorrupção e que esta camada não conhece o Tipo que estou enviando... um projeto LegacyAdapter, por exemplo. Daí, a intenção deste método seria buscar dados legados e convertê-los no Tipo que eu passei. Portanto, eu queria instanciar, talvez por reflexão, este Tipo Genérico que a camada não conhece a classe concreta. Resumindo, eu quero passar um Type para uma aplicação que não conhece esse Type, e ela se vira pra me devolver dados formatados com o Type que passei.

Sinceramente não sei se funcionaria com um tipo tão genérico assim. Geralmente se usa interfaces para não tornar o acoplamento tão impactante. Mas já testou fazer uma lista de Object? Afinal, essa seria a classe mais genérica possível.

Pode ser que tenha alguma perda de desempenho como é tratado na documentação.

Será que essa lista de Object te ajudaria?