Come confrontare i tipi


130

Domanda veloce: come confrontare un tipo di tipo (gioco di parole non previsto) con un altro tipo in C #? Voglio dire, ho una Type typeFielde voglio sapere se è System.String, System.DateTimee così via, ma typeField.Equals(System.String)non funziona.

Qualche idea?

Risposte:


179

Prova quanto segue

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

L' typeofoperatore in C # ti darà un Typeoggetto per il tipo indicato. Typele istanze sono comparabili con l' ==operatore, quindi questo è un buon metodo per confrontarle.

Nota: se ricordo bene, ci sono alcuni casi in cui questo si interrompe quando i tipi coinvolti sono interfacce COM che sono incorporate negli assiemi (tramite NoPIA). Non suona così qui.


74

È possibile utilizzare per esso l' is operatore . È quindi possibile verificare se l'oggetto è di tipo specifico scrivendo:

if (myObject is string)
{
  DoSomething()
}

3
È meglio per noi "is" o "typeof"?
Brent Wagoner,

32

Puoi confrontare esattamente lo stesso tipo usando:

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

typeof restituisce l'oggetto Type da una determinata classe.

Ma se hai un tipo B, che eredita da A, allora questo confronto è falso. E stai cercando 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 la tua istanza è un Type:

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

ma se l'istanza è una objecte non Typeutilizzare l' asoperatore:

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

questo ha il vantaggio di convertirsi valueuna sola volta nel tipo specificato.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.