Como comparar tipos


130

Pergunta rápida: como comparar um tipo de tipo (trocadilho não pretendido) com outro tipo em c #? Quer dizer, eu tenho um Type typeFielde eu quero saber se é System.String, System.DateTimeetc., mas typeField.Equals(System.String)não funciona.

Qualquer pista?

Respostas:


179

Tente o seguinte

typeField == typeof(string)
typeField == typeof(DateTime)

O typeofoperador em C # fornecerá um Typeobjeto para o tipo nomeado. Typeinstâncias são comparáveis ​​com o ==operador, portanto, este é um bom método para compará-las.

Nota: Se bem me lembro, há alguns casos em que isso ocorre quando os tipos envolvidos são interfaces COM que são incorporadas em assemblies (via NoPIA). Não parece que este é o caso aqui.


74

Você pode usar para isso o is operador . Você pode verificar se o objeto é do tipo específico escrevendo:

if (myObject is string)
{
  DoSomething()
}

3
É melhor para nós "é" ou "typeof"?
Brent Wagoner

32

Você pode comparar exatamente o mesmo tipo usando:

class A {
}
var a = new A();
var typeOfa = a.GetType();
if (typeOfa == typeof(A)) {
}

typeof retorna o objeto Type de uma determinada classe.

Mas se você tem um tipo B, que herda de A, essa comparação é falsa. E você está procurando IsAssignableFrom .

class B : A {
}
var b = new B();
var typeOfb = b.GetType();

if (typeOfb == typeof(A)) { // false
}

if (typeof(A).IsAssignableFrom(typeOfb)) { // true
}

7

Se sua instância for Type:

Type typeFiled;
if (typeField == typeof(string))
{ 
    ... 
}

mas se sua instância for um objecte não um Typeuse o asoperador:

object value;
string text = value as string;
if (text != null)
{
    // value is a string and you can do your work here
}

isso tem a vantagem de converter valueapenas uma vez no tipo especificado.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.