So vergleichen Sie Typen

130

Kurze Frage: Wie vergleiche ich einen Typtyp (Wortspiel nicht beabsichtigt) mit einem anderen Typ in C #? Ich meine, ich habe ein , Type typeFieldund ich möchte wissen , ob es ist System.String, System.DateTimeusw., aber typeField.Equals(System.String)nicht funktioniert.

Irgendeine Ahnung?

Archedius
quelle

Antworten:

179

Versuche Folgendes

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

Der typeofOperator in C # gibt Ihnen ein TypeObjekt für den benannten Typ. TypeInstanzen sind mit dem ==Operator vergleichbar , daher ist dies eine gute Methode, um sie zu vergleichen.

Hinweis: Wenn ich mich richtig erinnere, gibt es einige Fälle, in denen dies zusammenbricht, wenn es sich um COM-Schnittstellen handelt, die in Assemblys eingebettet sind (über NoPIA). Hört sich hier nicht so an.

JaredPar
quelle
74

Sie können dafür den is Operator verwenden . Sie können dann überprüfen, ob das Objekt ein bestimmter Typ ist, indem Sie Folgendes schreiben:

if (myObject is string)
{
  DoSomething()
}
Rafal Spacjer
quelle
3
Ist es besser für uns "ist" oder "Typ"?
Brent Waggoner
32

Sie können für genau den gleichen Typ vergleichen mit:

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

typeof gibt das Type-Objekt einer bestimmten Klasse zurück.

Wenn Sie jedoch einen Typ B haben, der von A erbt, ist dieser Vergleich falsch. Und Sie suchen nach IsAssignableFrom .

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

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

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

Wenn Ihre Instanz ein Type:

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

aber wenn Ihre Instanz eine objectund keine TypeVerwendung ist, verwenden Sie den asOperator:

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

Dies hat den Vorteil, dass valuenur einmal in den angegebenen Typ konvertiert werden kann.

Syntony
quelle