Skip to main content

Verificação de Tipos | Type.IsAssignableFrom, Type.IsSubclassOf, typeof, GetType, is, as | CSharp

  • Verificação de Tipos | Type.IsAssignableFrom, Type.IsSubclassOf, typeof, GetType, is, as | CSharp

1. Type.IsAssignableFrom

bool result = typeof(Base).IsAssignableFrom(typeof(Derived));

O que faz

Verifica se um objeto do tipo passado pode ser atribuído a uma variável do tipo atual.

Retorna true se:

  • Derived herda de Base
  • Derived implementa a interface Base
  • Os tipos são iguais

Uso típico

  • Reflection
  • Frameworks
  • Injeção de dependência

2. Operador is

if (obj is Base)
{
// obj é Base ou derivado
}

O que faz

Verifica em tempo de execução se um objeto é de um tipo específico ou derivado.

Características

  • Funciona com objetos (não com Type)
  • Muito usado no dia a dia

3. Operador as

Base b = obj as Base;

O que faz

Tenta converter o objeto para o tipo informado.

  • Retorna null se não for compatível
  • Não lança exceção

4. GetType()

if (obj.GetType() == typeof(Base))
{
}

O que faz

Verifica o tipo exato do objeto.

Atenção

  • Não considera herança
  • DerivedBase

5. Type.IsSubclassOf

bool result = typeof(Derived).IsSubclassOf(typeof(Base));

O que faz

Verifica se um tipo herda diretamente ou indiretamente de outro.

Limitações

  • Não funciona com interfaces
  • Retorna false se os tipos forem iguais

6. Comparação direta de tipos

if (typeof(Base) == typeof(Derived))
{
}

O que faz

Verifica se os tipos são exatamente iguais.


7. Pattern Matching (is moderno)

if (obj is Base b)
{
b.Metodo();
}

Vantagens

  • Mais legível
  • Evita casts manuais

8. typeof vs GetType()

typeofGetType()
Usado em tempo de compilaçãoUsado em runtime
Trabalha com tiposTrabalha com instâncias

9. Quando usar cada um

SituaçãoMelhor opção
Reflection / FrameworkIsAssignableFrom
Checar objeto em runtimeis
Converter com segurançaas
Ver tipo exatoGetType()
Ver herança apenasIsSubclassOf

10. Exemplo comparativo

class Base {}
class Derived : Base {}

var obj = new Derived();

obj is Base // true
obj.GetType() == typeof(Base) // false
typeof(Base).IsAssignableFrom(obj.GetType()) // true
typeof(Derived).IsSubclassOf(typeof(Base)) // true

Conclusão

C# oferece várias formas de trabalhar com tipos, cada uma adequada para um cenário diferente. Saber escolher evita bugs, melhora performance e deixa o código mais claro.