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 GetTypeFrom
CLSID() oder GetTypeFrom
ProgID() 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.