System.Type

Eintrag zuletzt aktualisiert am: 07.03.2005

Die Frage nach ihrem Typ konnte eine Variable im Component Object Model (COM) aufgrund eines unzureichenden Bewusstseins ihrer selbst nur sehr pauschal mit ihrem Typnamen beantworten. Detailinformationen über seine Fähigkeiten waren von einem COM-Objekt nicht direkt zu bekommen, sondern allenfalls indirekt über einen Zugriff auf die Typbibliothek, sofern eine solche überhaupt vorhanden war.

Im .NET Framework sind Metadaten Pflichtbestandteile einer jeden Komponente und Anwendung. Die Metadaten sind über den so genannten Reflection-Mechanismus innerhalb und außerhalb der Assembly auslesbar. Die Implementierung einer Methode GetType() in der Klasse System.Object sorgt dafür, dass jedes .NET-Objekt diese Methode besitzt und ein passendes Objekt vom Typ System.Type liefert, das Metainformationen über sich selbst enthält.

Wege zum Type-Objekt

Eine Instanz von System.Type erhält man auf verschiedenen Wegen, u.a. über die Methode GetType() eines jeden Objekts
System.Data.DataSet d = new System.Data.DataSet();
System.Type t = d.GetType();
oder über die gleichnamige statische Methode in der Klasse System.Type.
t = System.Type.GetType("System.Data.DataSet");
Im zweiten Fall ist der Name des Typs einschließlich Namensraum Namespace in der korrekten Groß-/Kleinschreibung anzugeben. Kann der Typ nicht gefunden werden, liefert die Methode Nothing bzw. null zurück. Durch optionale Parameter kann gesteuert werden, ob stattdessen eine Ausnahme erzeugt und ob die Groß-/Kleinschreibung ignoriert werden soll.
System.Type.GetType() sucht nur in den geladenen Assemblies. Typen in anderen Assemblies findet man, indem man sich zunächst eine passende Instanz von System.Reflection.Assembly verschafft und dann GetType() auf dem Assembly-Objekt aufruft.
Auch für COM-Objekte kann man Type-Objekte erhalten, indem man GetTypeFromCLSID() oder GetTypeFromProgID() aufruft.
Informationen im Type-Objekt
Ein Type-Objekt liefert zahlreiche Informationen, z.B. die Namen und Namensbestandteile. Dabei erkennt man auch, dass jeder Typ einen GUID besitzt für den Fall, dass die Klasse über die COM-Interoperabilität genutzt werden soll.
Console.WriteLine(t.FullName);
Console.WriteLine(t.Name);
Console.WriteLine(t.Namespace);
Console.WriteLine(t.GUID);
Das Attribut AssemblyQualifiedName liefert den vollständigen Namen der Assembly; Assembly das zugehörige Assembly-Objekt. Den Namen der Basisklasse des Typs erhält man über BaseType. Zur Erinnerung: Jede Klasse im .NET-Framework (außer System.Object) besitzt genau eine Oberklasse. Für Schnittstellen bleibt BaseType immer leer.
System.Type realisiert verfügt über eine große Menge von Boolean-Attributen, die Auskunft über Eigenschaften des Typs geben. Bestimmbar sind zum Beispiel auf diese Weise die Art des Typs,
Console.WriteLine(t.IsClass);
Console.WriteLine(t.IsInterface);
Console.WriteLine(t.IsEnum);
Console.WriteLine(t.IsPointer);
Console.WriteLine(t.IsPrimitive);
Console.WriteLine(t.IsValueType);
Console.WriteLine(t.IsArray);
die Form der Übergabe,
Console.WriteLine(t.IsByRef);
Console.WriteLine(t.IsMarshalByRef);
die Nutzbarkeit von COM aus,
Console.WriteLine(t.IsCOMObject);
die Sichtbarkeit,
Console.WriteLine(t.IsPublic);
Console.WriteLine(t.IsNotPublic);
und die Serialisierbarkeit
Console.WriteLine(t.IsSerializable);

Mitglieder ermitteln

Die Definition des Typs erforschen kann man über das von System.Type ausgehende Objektmodell, das in System.Reflection implementiert ist. Type implementiert zahlreiche Methoden (GetMethods(), GetProperties(), GetConstructors(), etc.), die Mengen mit den einzelnen Mitgliedern des Typs liefern. GetMembers() liefert eine übergreifende Liste aller Mitglieder.