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:
Derivedherda deBaseDerivedimplementa a interfaceBase- 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
nullse 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
Derived≠Base
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
falsese 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()
| typeof | GetType() |
|---|---|
| Usado em tempo de compilação | Usado em runtime |
| Trabalha com tipos | Trabalha com instâncias |
9. Quando usar cada um
| Situação | Melhor opção |
|---|---|
| Reflection / Framework | IsAssignableFrom |
| Checar objeto em runtime | is |
| Converter com segurança | as |
| Ver tipo exato | GetType() |
| Ver herança apenas | IsSubclassOf |
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.