Verificação de Tipo em C#: typeof, GetType ou is? Como não se confundir com três opções
\n\nTodo desenvolvedor C#, mais cedo ou mais tarde, se depara com a necessidade de verificar o tipo de um objeto. Parece simples, não? Mas quando você tem três opções — typeof, GetType() e is — os olhos se perdem e surge a pergunta inevitável: "Qual deles devo escolher?".
Este artigo não é apenas um resumo seco da documentação. Vamos analisar cada abordagem com exemplos reais, identificar armadilhas e dar recomendações claras. Após a leitura, você vai parar de adivinhar e saberá exatamente qual ferramenta usar em cada situação. Vamos lá!
\n\nPor que verificar tipos em C#?
\n\nAntes de mergulharmos nos detalhes, vamos lembrar por que isso é necessário. C# é uma linguagem fortemente tipada, mas isso não elimina situações em que o tipo de um objeto só é conhecido em tempo de execução. Aqui estão os cenários mais comuns:
\n\n- \n
- Trabalho com interfaces e classes base: Você recebe um objeto como
objectou um tipo base, e precisa saber seu tipo real. \n - Serialização e desserialização: JSON ou XML chegam como string, e é necessário restaurar o tipo específico. \n
- Reflexão (Reflection): Quando você cria objetos dinamicamente ou chama métodos, sabendo apenas o nome do tipo. \n
- Registro de logs e depuração: Às vezes, você só precisa registrar no log com qual tipo está trabalhando. \n
E é aqui que entram nossos três heróis. Vamos conhecer cada um mais de perto.
\n\ntypeof — uma visão estática do futuro
\n\ntypeof é um operador que retorna um objeto System.Type para um tipo conhecido em tempo de compilação. Ele funciona como um serviço de informações: "Diga-me o nome da classe, e eu te darei todas as informações sobre ela".
Como funciona:
\nType stringType = typeof(string);\nConsole.WriteLine(stringType.FullName); // Saída: System.String\n\nType intType = typeof(int);\nConsole.WriteLine(intType.FullName); // Saída: System.Int32\n\nCaracterística principal: typeof não requer uma instância do objeto. É uma operação estática. Você diz ao compilador: "Eu tenho o tipo MyClass, me dê seus metadados".
Quando usar:
\n- \n
- Quando você precisa do tipo pelo nome da classe, e não por um objeto. \n
- Em atributos (por exemplo,
[AttributeUsage(typeof(MyAttribute))]). \n - Em genéricos:
typeof(List<>). \n
Armadilha: typeof sempre retorna o tipo exato que você especificou no código. Ele não sabe sobre herança. Se você tem class Dog : Animal { }, então typeof(Animal) nunca será typeof(Dog).
GetType() — investigação dinâmica
\n\nAo contrário de typeof, o método GetType() é chamado em uma instância do objeto. Ele pega o objeto real na memória e diz: "Ah, então é você de verdade!".
Exemplo:
\nobject obj = "Olá, mundo!";\nType typeOfObj = obj.GetType();\nConsole.WriteLine(typeOfObj.FullName); // Saída: System.String\n\n// Agora um truque:\nobject obj2 = 42;\nType typeOfObj2 = obj2.GetType();\nConsole.WriteLine(typeOfObj2.FullName); // Saída: System.Int32\n\nObserve: a variável obj é declarada como object, mas GetType() "enxerga" através dessa camada e retorna System.String. Isso é a determinação dinâmica de tipo.
Quando usar:
\n- \n
- Quando você precisa saber o tipo exato de um objeto em tempo de execução. \n
- Para comparação de tipos:
obj.GetType() == typeof(MyClass). \n