Type.GetType Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Ruft ein Type-Objekt ab, das den angegebenen Typ darstellt.
Überlädt
GetType() |
Ruft den aktuellen Type ab. |
GetType(String) |
Ruft den Type mit dem angegebenen Namen ab. Bei der Suche wird die Groß-/Kleinschreibung beachtet. |
GetType(String, Boolean) |
Ruft den Type mit dem angegebenen Namen ab. Bei der Suche wird die Groß-/Kleinschreibung beachtet. Dabei wird angegeben, ob eine Ausnahme ausgelöst werden soll, wenn der Typ nicht gefunden wird. |
GetType(String, Boolean, Boolean) |
Ruft den Type mit dem angegebenen Namen ab. Dabei wird angegeben, ob bei der Suche Groß- und Kleinschreibung berücksichtigt werden soll und ob eine Ausnahme ausgelöst werden soll, wenn der Typ nicht gefunden wird. |
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) |
Ruft den Typ mit dem angegebenen Namen ab und stellt optional benutzerdefinierte Methoden bereit, um die Assembly und den Typ aufzulösen. |
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean) |
Ruft den Typ mit dem angegebenen Namen ab. Dabei wird angegeben, ob eine Ausnahme ausgelöst werden soll, wenn der Typ nicht gefunden wird, und optional werden benutzerdefinierte Methoden bereitgestellt, um die Assembly und den Typ aufzulösen. |
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) |
Ruft den Typ mit dem angegebenen Namen ab. Dabei wird angegeben, ob bei der Suche die Groß-/Kleinschreibung beachtet werden soll und ob eine Ausnahme ausgelöst werden soll, wenn der Typ nicht gefunden wird, und optional werden benutzerdefinierte Methoden bereitgestellt, um die Assembly und den Typ aufzulösen. |
GetType()
Ruft den aktuellen Type ab.
public:
Type ^ GetType();
public:
virtual Type ^ GetType();
public Type GetType ();
override this.GetType : unit -> Type
Public Function GetType () As Type
Gibt zurück
Der aktuelle Type.
Implementiert
Ausnahmen
Ein Klasseninitialisierer wird aufgerufen und löst eine Ausnahme aus.
Siehe auch
Gilt für:
GetType(String)
Ruft den Type mit dem angegebenen Namen ab. Bei der Suche wird die Groß-/Kleinschreibung beachtet.
public:
static Type ^ GetType(System::String ^ typeName);
public static Type GetType (string typeName);
public static Type? GetType (string typeName);
static member GetType : string -> Type
Public Shared Function GetType (typeName As String) As Type
Parameter
- typeName
- String
Der durch die Assembly bezeichnete Name des abzurufenden Typs. Siehe AssemblyQualifiedName. Wenn sich der Typ in der aktuell ausgeführten Assembly oder mscorlib.dll/System.Private.CoreLib.dll befindet, ist eine Angabe des Typnamens einschließlich des qualifizierenden Namespace ausreichend.
Gibt zurück
Der Typ mit dem angegebenen Namen, sofern gefunden, andernfalls null
.
Ausnahmen
typeName
ist null
.
Ein Klasseninitialisierer wird aufgerufen und löst eine Ausnahme aus.
typeName
stellt einen generischen Typ dar, der einen Zeigertyp, einen ByRef
-Typ oder Void als eines seiner Typargumente aufweist.
- oder -
typeName
stellt einen generischen Typ dar, der eine falsche Anzahl von Typargumenten aufweist.
- oder -
typeName
stellt einen generischen Typ dar, und eines seiner Typargumente erfüllt nicht die Einschränkungen für den entsprechenden Typparameter.
typeName
stellt ein Array von TypedReference dar.
Die Assembly oder eine der zugehörigen Abhängigkeiten wurde gefunden, konnte aber nicht geladen werden.
Hinweis: In .NET für Windows Store Apps oder die Portable Class Library fangen Sie stattdessen die Basisklasse-Ausnahme ab. IOException
Die Assembly oder eine der zugehörigen Abhängigkeiten ist ungültig.
- oder -
Version 2.0 oder höher der Common Language Runtime ist derzeit geladen, und die Assembly wurde mit einer höheren Version kompiliert.
Beispiele
Im folgenden Beispiel wird der Typ System.Int32
abgerufen und verwendet dieses Typobjekt, um die FullName Eigenschaft von System.Int32
.
using namespace System;
int main()
{
try {
// Get the type of a specified class.
Type^ myType1 = Type::GetType( "System.Int32" );
Console::WriteLine( "The full name is {0}.\n", myType1->FullName );
}
catch ( TypeLoadException^ e ) {
Console::WriteLine("{0}: Unable to load type System.Int32",
e->GetType()->Name);
}
try {
// Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
Type^ myType2 = Type::GetType( "NoneSuch", true );
Console::WriteLine( "The full name is {0}.", myType2->FullName );
}
catch ( TypeLoadException^ e ) {
Console::WriteLine("{0}: Unable to load type NoneSuch",
e->GetType()->Name);
}
}
// The example displays the following output:
// The full name is System.Int32.
//
// TypeLoadException: Unable to load type NoneSuch
using System;
class Example
{
public static void Main()
{
try {
// Get the type of a specified class.
Type myType1 = Type.GetType("System.Int32");
Console.WriteLine("The full name is {0}.\n", myType1.FullName);
}
catch (TypeLoadException e)
{
Console.WriteLine("{0}: Unable to load type System.Int32", e.GetType().Name);
}
try {
// Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
Type myType2 = Type.GetType("NoneSuch", true);
Console.WriteLine("The full name is {0}.", myType2.FullName);
}
catch(TypeLoadException e) {
Console.WriteLine("{0}: Unable to load type NoneSuch", e.GetType().Name);
}
}
}
// The example displays the following output:
// The full name is System.Int32.
//
// TypeLoadException: Unable to load type NoneSuch
open System
try
// Get the type of a specified class.
let myType1 = Type.GetType "System.Int32"
printfn $"The full name is {myType1.FullName}.\n"
with :? TypeLoadException as e ->
printfn $"{e.GetType().Name}: Unable to load type System.Int32"
try
// Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
let myType2 = Type.GetType("NoneSuch", true)
printfn $"The full name is {myType2.FullName}."
with :? TypeLoadException as e ->
printfn $"{e.GetType().Name}: Unable to load type NoneSuch"
// The example displays the following output:
// The full name is System.Int32.
//
// TypeLoadException: Unable to load type NoneSuch
Class Example
Public Shared Sub Main()
Try
' Get the type of the specified class.
Dim myType1 As Type = Type.GetType("System.Int32")
Console.WriteLine("The full name is {0}.", myType1.FullName)
Catch e As TypeLoadException
Console.WriteLine("{0}: Unable to load type System.Int32",
e.GetType().Name)
End Try
Console.WriteLine()
Try
' Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
Dim myType2 As Type = Type.GetType("NoneSuch", True)
Console.WriteLine("The full name is {0}.", myType2.FullName)
Catch e As TypeLoadException
Console.WriteLine("{0}: Unable to load type NoneSuch", e.GetType().Name)
End Try
End Sub
End Class
' The example displays the following output:
' The full name is System.Int32.
'
' TypeLoadException: Unable to load type NoneSuch
Hinweise
Sie können die GetType Methode verwenden, um ein Objekt für einen Type Typ in einer anderen Assembly abzurufen, wenn Sie den assemblyqualifizierten Namen kennen, der von AssemblyQualifiedName. GetType verursacht das Laden der in typeName
. Sie können eine Assembly auch mithilfe der Assembly.Load Methode laden und dann die Assembly.GetType Oder-Methode Assembly.GetTypes verwenden, um Objekte abzurufen Type . Wenn sich ein Typ zur Kompilierungszeit in einer Assembly befindet, die ihrem Programm zur Kompilierung bekannt ist, ist es effizienter, in C# oder dem GetType
Operator in Visual Basic zu verwendentypeof
.
Hinweis
Wenn typeName
nicht gefunden werden kann, gibt der Aufruf der GetType(String) Methode zurück null
. Es löst keine Ausnahme aus. Rufen Sie eine Überladung der GetType Methode mit einem throwOnError
Parameter auf, um zu steuern, ob eine Ausnahme ausgelöst wird.
GetType Funktioniert nur auf Assemblys, die vom Datenträger geladen wurden. Wenn Sie einen typ aufrufen GetType , der in einer dynamischen Assembly definiert ist, die mithilfe der System.Reflection.Emit Dienste definiert ist, wird möglicherweise ein inkonsistentes Verhalten angezeigt. Das Verhalten hängt davon ab, ob die dynamische Assembly beständig ist, d. h. mithilfe der RunAndSave
Modi oder Save
des Zugriffsmodus der System.Reflection.Emit.AssemblyBuilderAccess Enumeration erstellt wird. Wenn die dynamische Assembly beständig ist und vor GetType
dem Aufrufen in den Datenträger geschrieben wurde, findet der Ladeer die gespeicherte Assembly auf dem Datenträger, lädt diese Assembly und ruft den Typ aus dieser Assembly ab. Wenn die Assembly nicht auf dem Datenträger gespeichert wurde, wenn GetType
sie aufgerufen wird, gibt die Methode zurück null
. GetType
versteht keine vorübergehenden dynamischen Assemblys; Daher gibt das Aufrufen GetType
eines Typs in einer vorübergehenden dynamischen Assembly zurück null
.
Wenn Sie für ein dynamisches Modul verwenden möchten GetType
, abonnieren Sie das AppDomain.AssemblyResolve Ereignis und rufen Sie an GetType
, bevor Sie speichern. Andernfalls erhalten Sie zwei Kopien der Assembly im Arbeitsspeicher.
In der folgenden Tabelle wird gezeigt, welche Elemente einer Basisklasse durch die Get
Methoden zurückgegeben werden, wenn sie einen Typ widerspiegeln.
Memberart | statischen | Nicht statisch |
---|---|---|
Konstruktor | Nein | Nein |
Feld | Nein | Ja. Ein Feld ist immer nach Name und Signatur ausgeblendet. |
Ereignis | Nicht zutreffend | Die allgemeine Typsystemregel besteht darin, dass die Vererbung mit den Methoden identisch ist, die die Eigenschaft implementieren. Reflection behandelt Eigenschaften als Hide-by-name-and-signature. Siehe Hinweis 2 unten. |
Methode | Nein | Ja. Eine Methode (sowohl virtuelle als auch nicht virtuelle) kann nach Name oder Nachname ausgeblendet oder nach Name und Signatur ausgeblendet werden. |
Geschachtelter Typ | Nein | Nein |
Eigenschaft | Nicht zutreffend | Die allgemeine Typsystemregel besteht darin, dass die Vererbung mit den Methoden identisch ist, die die Eigenschaft implementieren. Reflection behandelt Eigenschaften als Hide-by-name-and-signature. Siehe Hinweis 2 unten. |
Hide-by-name-and-signature betrachtet alle Teile der Signatur, einschließlich benutzerdefinierter Modifizierer, Rückgabetypen, Parametertypen, Sentinels und nicht verwaltete Aufrufkonventionen. Dies ist ein binärer Vergleich.
Für Spiegelung werden Eigenschaften und Ereignisse nach Name und Signatur ausgeblendet. Wenn Sie über eine Eigenschaft mit einem Get- und einem Set-Accessor in der Basisklasse verfügen, aber die abgeleitete Klasse nur über einen Get-Accessor verfügt, blendet die abgeleitete Klasseneigenschaft die Basisklasseneigenschaft aus, und Sie können nicht auf den Setter auf die Basisklasse zugreifen.
Benutzerdefinierte Attribute sind nicht Teil des allgemeinen Typsystems.
Arrays oder COM-Typen werden nicht durchsucht, es sei denn, sie wurden bereits in die Tabelle der verfügbaren Klassen geladen.
typeName
kann der Typname sein, der durch den Namespace oder einen assemblyqualifizierten Namen qualifiziert ist, der eine Assemblynamenspezifikation enthält. Siehe AssemblyQualifiedName.
Wenn typeName
der Namespace, aber nicht der Assemblyname enthalten ist, durchsucht diese Methode nur die Assembly des aufrufenden Objekts und mscorlib.dll/System.Private.CoreLib.dll in dieser Reihenfolge. Wenn typeName vollständig mit dem teil- oder vollständigen Assemblynamen qualifiziert ist, durchsucht diese Methode in der angegebenen Assembly. Wenn die Assembly einen starken Namen hat, ist ein vollständiger Assemblyname erforderlich.
Die AssemblyQualifiedName Eigenschaft gibt einen vollqualifizierten Typnamen zurück, einschließlich geschachtelter Typen, des Assemblynamens und generischer Typargumente. Alle Compiler, die die gemeinsame Sprachlaufzeit unterstützen, geben den einfachen Namen einer geschachtelten Klasse aus, und Spiegelung erstellt einen geschachtelten Namen, wenn abgefragt wird, in Übereinstimmung mit den folgenden Konventionen.
Hinweis
In der .NET Framework Version 2.0 wird die Prozessorarchitektur der Assemblyidentität hinzugefügt und kann als Teil von Assemblynamenzeichenfolgen angegeben werden. Beispiel: "ProcessorArchitecture=msil". Sie ist jedoch aus Kompatibilitätsgründen nicht in der von der AssemblyQualifiedName Eigenschaft zurückgegebenen Zeichenfolge enthalten. Sie können auch Typen laden, indem Sie ein AssemblyName Objekt erstellen und an eine entsprechende Überladung der Load Methode übergeben. Anschließend können Sie die Assembly.GetType Methode verwenden, um Typen aus der Assembly zu laden. Siehe auch AssemblyName.ProcessorArchitecture.
Trennzeichen | Bedeutung |
---|---|
Umgekehrter Schrägstrich (\) | Escapezeichen. |
Backtick (') | Stellt eine oder mehrere Ziffern voran, die die Anzahl der Typparameter darstellen, die sich am Ende des Namens eines generischen Typs befinden. |
Klammern ([]) | Schließen Sie eine generische Typargumentliste für einen konstruierten generischen Typ ein; schließen Sie innerhalb einer Typargumentliste einen assemblyqualifizierten Typ ein. |
Komma (,) | Stellt den Assemblynamen voran. |
Punkt (.) | Gibt Namespacebezeichner an. |
Pluszeichen (+) | Stellt eine geschachtelte Klasse voran. |
Der vollqualifizierte Name für eine Klasse könnte beispielsweise wie folgt aussehen:
TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly
Wenn der Namespace TopNamespace.Sub+Namespace war, müsste die Zeichenfolge dem Pluszeichen (+) ein Escapezeichen\ (+) voranstellen, um zu verhindern, dass es als Verschachtelungstrennzeichen interpretiert wird. Reflection gibt diese Zeichenfolge wie folgt aus:
TopNamespace.Sub\+Namespace.ContainingClass+NestedClass,MyAssembly
Ein "++" wird zu "\+\+", und ein "\" wird "\\".
Dieser qualifizierte Name kann beibehalten und später verwendet werden, um die Type. Verwenden Sie GetType zum Suchen und Laden eines TypeTyps entweder nur mit dem Namen des Typs oder mit dem assemblyqualifizierten Typnamen. GetType mit dem Typnamen sucht nur nach der Type Assembly des Aufrufers und dann in der Systemassembly. GetType mit dem Namen des qualifizierten Assemblytyps wird nach der Type Assembly in einer beliebigen Assembly gesucht.
Typnamen können nachgestellte Zeichen enthalten, die zusätzliche Informationen zum Typ angeben, z. B. ob der Typ ein Bezugstyp, ein Zeigertyp oder ein Arraytyp ist. Wenn Sie den Typnamen ohne diese nachgestellten Zeichen abrufen möchten, verwenden Sie t.GetElementType().ToString()
hier t
den Typ.
Leerzeichen sind in allen Typnamenkomponenten mit Ausnahme des Assemblynamens relevant. Im Assemblynamen sind Leerzeichen vor dem Trennzeichen "," relevant, aber Leerzeichen nach dem Trennzeichen "," werden ignoriert.
Der Name eines generischen Typs endet mit einem Backtick (`) gefolgt von Ziffern, die die Anzahl der generischen Typargumente darstellen. Der Zweck dieses Namensmanglings besteht darin, Compilern die Unterstützung generischer Typen mit demselben Namen zu ermöglichen, aber mit unterschiedlichen Zahlen von Typparametern, die im gleichen Bereich auftreten. Die Spiegelung gibt beispielsweise die gehandelten Namen Tuple`1
und Tuple`2
aus den generischen Methoden Tuple(Of T)
und Tuple(Of T0, T1)
in Visual Basic oder Tuple<T>
in Tuple<T0, T1>
Visual C# zurück.
Bei generischen Typen wird die Typargumentliste in Klammern eingeschlossen, und die Typargumente werden durch Kommas getrennt. Beispielsweise verfügt ein generisches Dictionary<TKey,TValue> Steuerelement über zwei Typparameter. Eine Dictionary<TKey,TValue> der MyType
Schlüssel des Typs String kann wie folgt dargestellt werden:
System.Collections.Generic.Dictionary`2[System.String,MyType]
Um einen assemblyqualifizierten Typ in einer Typargumentliste anzugeben, schließen Sie den assemblyqualifizierten Typ in Klammern ein. Andernfalls werden die Kommas, die die Teile des assemblyqualifizierten Namens trennen, als Trennzeichen zusätzlicher Typargumente interpretiert. Beispielsweise kann eine Dictionary<TKey,TValue> von MyType
fromMyAssembly.dll mit Schlüsseln vom Typ Stringwie folgt angegeben werden:
Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")
Hinweis
Ein assemblyqualifizierter Typ kann nur in Klammern eingeschlossen werden, wenn er in einer Typparameterliste angezeigt wird. Die Regeln für die Suche nach Assemblys für qualifizierte und nicht qualifizierte Typen in Typparameterlisten sind identisch mit den Regeln für qualifizierte und nichtgenerische Typen.
Nullfähige Typen sind ein Sonderfall generischer Typen. Beispielsweise wird eine Nullwerte Int32 durch die Zeichenfolge "System.Nullable'1[System.Int32]" dargestellt.
Hinweis
In C#, C++ und Visual Basic können Sie auch nullfähige Typen mithilfe von Typoperatoren abrufen. Der nullfähige Boolean Typ wird z. B. in C# Nullable<Boolean>::typeid
und in C++ und GetType(Nullable(Of Boolean))
in Visual Basic zurückgegebentypeof(Nullable<bool>)
.
In der folgenden Tabelle sind die Syntax aufgeführt, die Sie für verschiedene Typen verwenden GetType
.
So rufen Sie | Verwendung |
---|---|
Nullwerte Int32 | Type.GetType("System.Nullable`1[System.Int32]") |
Ein nicht verwalteter Zeiger auf MyType |
Type.GetType("MyType*") |
Ein nicht verwalteter Zeiger auf einen Zeiger auf MyType |
Type.GetType("MyType**") |
Ein verwalteter Zeiger oder Verweis auf MyType |
Type.GetType("MyType&") . Beachten Sie, dass Verweise im Gegensatz zu Zeigern auf eine Ebene beschränkt sind. |
Eine übergeordnete Klasse und eine geschachtelte Klasse | Type.GetType("MyParentClass+MyNestedClass") |
Ein eindimensionales Array mit einer unteren Grenze von 0 | Type.GetType("MyType[]") |
Ein eindimensionales Array mit einer unbekannten Untergrenze | Type.GetType("MyType[*]") |
Ein ndimensionales Array | Ein Komma (,) innerhalb der Klammern insgesamt n-1 mal. Stellt beispielsweise System.Object[,,] ein dreidimensionales Object Array dar. |
Ein Array von eindimensionalen Arrays | Type.GetType("MyType[][]") |
Ein rechteckiges zweidimensionales Array mit unbekannten Untergrenzen | Type.GetType("MyType[,]") |
Ein generischer Typ mit einem Typargument | Type.GetType("MyGenericType`1[MyType]") |
Ein generischer Typ mit zwei Typargumenten | Type.GetType("MyGenericType`2[MyType,AnotherType]") |
Ein generischer Typ mit zwei assemblyqualifizierten Typargumenten | Type.GetType("MyGenericType`2[[MyType,MyAssembly],[AnotherType,AnotherAssembly]]") |
Ein assemblyqualifizierter generischer Typ mit einem assemblyqualifizierten Typargument | Type.GetType("MyGenericType`1[[MyType,MyAssembly]],MyGenericTypeAssembly") |
Ein generischer Typ, dessen Typargument ein generischer Typ mit zwei Typargumenten ist | Type.GetType("MyGenericType`1[AnotherGenericType`2[MyType,AnotherType]]") |
Siehe auch
- String
- TypeLoadException
- AssemblyQualifiedName
- GetAssembly(Type)
- GetType(String)
- AssemblyName
- Angeben vollständig gekennzeichneter Typnamen
Gilt für:
GetType(String, Boolean)
Ruft den Type mit dem angegebenen Namen ab. Bei der Suche wird die Groß-/Kleinschreibung beachtet. Dabei wird angegeben, ob eine Ausnahme ausgelöst werden soll, wenn der Typ nicht gefunden wird.
public:
static Type ^ GetType(System::String ^ typeName, bool throwOnError);
public static Type GetType (string typeName, bool throwOnError);
public static Type? GetType (string typeName, bool throwOnError);
static member GetType : string * bool -> Type
Public Shared Function GetType (typeName As String, throwOnError As Boolean) As Type
Parameter
- typeName
- String
Der durch die Assembly bezeichnete Name des abzurufenden Typs. Siehe AssemblyQualifiedName. Wenn sich der Typ in der aktuell ausgeführten Assembly oder mscorlib.dll/System.Private.CoreLib.dll befindet, ist eine Angabe des Typnamens einschließlich des qualifizierenden Namespace ausreichend.
- throwOnError
- Boolean
true
, damit eine Ausnahme ausgelöst wird, wenn der Typ nicht gefunden werden kann, false
, damit null
zurückgegeben wird. Die Angabe von false
unterdrückt auch einige andere Ausnahmebedingungen, aber nicht alle. Informationen finden Sie im Abschnitt für Ausnahmen.
Gibt zurück
Der Typ mit dem angegebenen Namen. Wenn der Typ nicht gefunden wird, gibt der throwOnError
-Parameter an, ob null
zurückgegeben oder eine Ausnahme ausgelöst wird. In einigen Fällen wird unabhängig vom Wert von throwOnError
eine Ausnahme ausgelöst. Informationen finden Sie im Abschnitt für Ausnahmen.
Ausnahmen
typeName
ist null
.
Ein Klasseninitialisierer wird aufgerufen und löst eine Ausnahme aus.
throwOnError
ist true
, und der Typ wurde nicht gefunden.
- oder -
throwOnError
ist true
, und typeName
enthält ungültige Zeichen, z. B. ein eingebettetes Tabstoppzeichen.
- oder -
throwOnError
ist true
, und typeName
ist eine leere Zeichenfolge.
- oder -
throwOnError
ist true
, und typeName
stellt einen Arraytyp mit einer ungültigen Größe dar.
- oder -
typeName
stellt ein Array von TypedReference dar.
throwOnError
ist true
, und typeName
enthält ungültige Syntax, beispielsweise "MyType[,*,]".
- oder -
typeName
stellt einen generischen Typ dar, der einen Zeigertyp, einen ByRef
-Typ oder Void als eines seiner Typargumente aufweist.
- oder -
typeName
stellt einen generischen Typ dar, der eine falsche Anzahl von Typargumenten aufweist.
- oder -
typeName
stellt einen generischen Typ dar, und eines seiner Typargumente erfüllt nicht die Einschränkungen für den entsprechenden Typparameter.
throwOnError
ist true
, und die Assembly oder eine der zugehörigen Abhängigkeiten wurde nicht gefunden.
Die Assembly oder eine der zugehörigen Abhängigkeiten wurde gefunden, konnte aber nicht geladen werden.
Hinweis: In .NET für Windows Store Apps oder die portable Klassenbibliothek erfassen Sie stattdessen die Basisklassen-Ausnahme, IOExceptionsondern.
Die Assembly oder eine der zugehörigen Abhängigkeiten ist ungültig.
- oder -
Version 2.0 oder höher der Common Language Runtime ist derzeit geladen, und die Assembly wurde mit einer höheren Version kompiliert.
Beispiele
Im folgenden Beispiel wird der Typ System.Int32
abgerufen und verwendet dieses Typobjekt, um die FullName Eigenschaft von System.Int32
. Wenn ein Typobjekt auf eine Assembly verweist, die nicht vorhanden ist, löst dieses Beispiel eine Ausnahme aus.
using namespace System;
int main()
{
try {
// Get the type of a specified class.
Type^ myType1 = Type::GetType( "System.Int32" );
Console::WriteLine( "The full name is {0}.\n", myType1->FullName );
}
catch ( TypeLoadException^ e ) {
Console::WriteLine("{0}: Unable to load type System.Int32",
e->GetType()->Name);
}
try {
// Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
Type^ myType2 = Type::GetType( "NoneSuch", true );
Console::WriteLine( "The full name is {0}.", myType2->FullName );
}
catch ( TypeLoadException^ e ) {
Console::WriteLine("{0}: Unable to load type NoneSuch",
e->GetType()->Name);
}
}
// The example displays the following output:
// The full name is System.Int32.
//
// TypeLoadException: Unable to load type NoneSuch
using System;
class Example
{
public static void Main()
{
try {
// Get the type of a specified class.
Type myType1 = Type.GetType("System.Int32");
Console.WriteLine("The full name is {0}.\n", myType1.FullName);
}
catch (TypeLoadException e)
{
Console.WriteLine("{0}: Unable to load type System.Int32", e.GetType().Name);
}
try {
// Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
Type myType2 = Type.GetType("NoneSuch", true);
Console.WriteLine("The full name is {0}.", myType2.FullName);
}
catch(TypeLoadException e) {
Console.WriteLine("{0}: Unable to load type NoneSuch", e.GetType().Name);
}
}
}
// The example displays the following output:
// The full name is System.Int32.
//
// TypeLoadException: Unable to load type NoneSuch
open System
try
// Get the type of a specified class.
let myType1 = Type.GetType "System.Int32"
printfn $"The full name is {myType1.FullName}.\n"
with :? TypeLoadException as e ->
printfn $"{e.GetType().Name}: Unable to load type System.Int32"
try
// Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
let myType2 = Type.GetType("NoneSuch", true)
printfn $"The full name is {myType2.FullName}."
with :? TypeLoadException as e ->
printfn $"{e.GetType().Name}: Unable to load type NoneSuch"
// The example displays the following output:
// The full name is System.Int32.
//
// TypeLoadException: Unable to load type NoneSuch
Class Example
Public Shared Sub Main()
Try
' Get the type of the specified class.
Dim myType1 As Type = Type.GetType("System.Int32")
Console.WriteLine("The full name is {0}.", myType1.FullName)
Catch e As TypeLoadException
Console.WriteLine("{0}: Unable to load type System.Int32",
e.GetType().Name)
End Try
Console.WriteLine()
Try
' Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
Dim myType2 As Type = Type.GetType("NoneSuch", True)
Console.WriteLine("The full name is {0}.", myType2.FullName)
Catch e As TypeLoadException
Console.WriteLine("{0}: Unable to load type NoneSuch", e.GetType().Name)
End Try
End Sub
End Class
' The example displays the following output:
' The full name is System.Int32.
'
' TypeLoadException: Unable to load type NoneSuch
Hinweise
Sie können die GetType Methode verwenden, um ein Objekt für einen Type Typ in einer anderen Assembly abzurufen, wenn Sie den assemblyqualifizierten Namen kennen, der aus AssemblyQualifiedNameabgerufen werden kann. GetType verursacht das Laden der in typeName
. Sie können auch eine Assembly mithilfe der Assembly.Load Methode laden und dann die oder Assembly.GetTypes die Assembly.GetType Methode verwenden, um Objekte abzurufenType. Wenn sich ein Typ in einer Assembly befindet, die zum Kompilieren des Programms bekannt ist, ist es effizienter, in C# oder GetType
dem Operator in Visual Basic zu verwendentypeof
.
GetType
funktioniert nur auf Assemblys, die auf dem Datenträger geladen wurden. Wenn Sie aufrufen, einen Typ nachzuschlagen, der in einer dynamischen Assembly definiert ist, die mithilfe der System.Reflection.Emit Dienste definiert ist, erhalten Sie GetType
möglicherweise ein inkonsistentes Verhalten. Das Verhalten hängt davon ab, ob die dynamische Assembly beständig ist, d. h. mit den RunAndSave
Oder Save
Zugriffsmodi der System.Reflection.Emit.AssemblyBuilderAccess Enumeration erstellt wird. Wenn die dynamische Assembly beständig ist und vor GetType
dem Aufruf in den Datenträger geschrieben wurde, findet der Loader die gespeicherte Assembly auf dem Datenträger, lädt diese Assembly und ruft den Typ aus dieser Assembly ab. Wenn die Assembly beim Aufrufen nicht auf dem Datenträger GetType
gespeichert wurde, gibt die Methode zurück null
. GetType
versteht keine vorübergehenden dynamischen Assemblys; Daher gibt der Aufruf GetType
eines Typs in einer vorübergehenden dynamischen Assembly zurück null
.
Wenn Sie ein dynamisches Modul verwenden GetType
möchten, abonnieren Sie das AppDomain.AssemblyResolve Ereignis und rufen Sie an GetType
, bevor Sie speichern. Andernfalls erhalten Sie zwei Kopien der Assembly im Arbeitsspeicher.
Der throwOnError
Parameter gibt an, was geschieht, wenn der Typ nicht gefunden wird und auch bestimmte andere Ausnahmebedingungen unterdrückt, wie im Abschnitt "Ausnahmen" beschrieben. Einige Ausnahmen werden unabhängig vom Wert throwOnError
von . Wenn der Typ z. B. gefunden wird, aber nicht geladen werden kann, wird eine TypeLoadException auch dann ausgelöst, wenn throwOnError
false
es sich um einen Wert handelt.
In der folgenden Tabelle wird gezeigt, welche Elemente einer Basisklasse durch die Get
Methoden zurückgegeben werden, wenn sie einen Typ widerspiegeln.
Memberart | statischen | Nicht statischer |
---|---|---|
Konstruktor | Nein | Nein |
Feld | Nein | Ja. Ein Feld ist immer ausgeblendet nach Name und Signatur. |
Ereignis | Nicht zutreffend | Die allgemeine Typsystemregel besteht darin, dass die Vererbung identisch mit den Methoden ist, die die Eigenschaft implementieren. Die Spiegelung behandelt Eigenschaften als Ausblenden nach Name und Signatur. Siehe Hinweis 2 unten. |
Methode | Nein | Ja. Eine Methode (sowohl virtuelle als auch nicht virtuelle) kann nach Name oder Ausblenden nach Name und Signatur ausgeblendet werden. |
Geschachtelter Typ | Nein | Nein |
Eigenschaft | Nicht zutreffend | Die allgemeine Typsystemregel besteht darin, dass die Vererbung identisch mit den Methoden ist, die die Eigenschaft implementieren. Die Spiegelung behandelt Eigenschaften als Ausblenden nach Name und Signatur. Siehe Hinweis 2 unten. |
Hide-by-name-and-signature betrachtet alle Teile der Signatur, einschließlich benutzerdefinierter Modifizierer, Rückgabetypen, Parametertypen, Sentinels und nicht verwaltete Aufrufkonventionen. Dies ist ein binärer Vergleich.
Für die Spiegelung werden Eigenschaften und Ereignisse nach Name und Signatur ausgeblendet. Wenn Sie über eine Eigenschaft mit einem Get- und einem Set-Accessor in der Basisklasse verfügen, aber die abgeleitete Klasse nur einen Get-Accessor hat, blendet die abgeleitete Klasseneigenschaft die Basisklasse-Eigenschaft aus, und Sie können nicht auf den Setter auf die Basisklasse zugreifen.
Benutzerdefinierte Attribute sind nicht Teil des allgemeinen Typsystems.
Arrays oder COM-Typen werden nicht gesucht, es sei denn, sie wurden bereits in die Tabelle der verfügbaren Klassen geladen.
typeName
kann der Typname sein, der durch seinen Namespace oder einen assemblyqualifizierten Namen qualifiziert ist, der eine Assemblynamenspezifikation enthält. Siehe AssemblyQualifiedName.
Wenn typeName
der Namespace, aber nicht der Assemblyname enthalten ist, durchsucht diese Methode nur die Assembly des aufrufenden Objekts und mscorlib.dll/System.Private.CoreLib.dll in dieser Reihenfolge. Wenn typeName vollständig mit dem Namen der teilweisen oder vollständigen Assembly qualifiziert ist, sucht diese Methode in der angegebenen Assembly. Wenn die Assembly über einen starken Namen verfügt, ist ein vollständiger Assemblyname erforderlich.
Die AssemblyQualifiedName Eigenschaft gibt einen vollqualifizierten Typnamen zurück, einschließlich geschachtelter Typen, des Assemblynamens und generischer Argumente. Alle Compiler, die die allgemeine Sprachlaufzeit unterstützen, geben den einfachen Namen einer geschachtelten Klasse aus, und die Spiegelung erstellt einen manglierten Namen, wenn abgefragt wird, gemäß den folgenden Konventionen.
Hinweis
In der .NET Framework Version 2.0 wird die Prozessorarchitektur zur Assemblyidentität hinzugefügt und kann als Teil der Assemblynamenzeichenfolgen angegeben werden. Beispiel: "ProcessorArchitecture=msil". Es ist jedoch nicht in die von der AssemblyQualifiedName Eigenschaft zurückgegebene Zeichenfolge enthalten, aus Kompatibilitätsgründen. Sie können auch Typen laden, indem Sie ein AssemblyName Objekt erstellen und an eine entsprechende Überladung der Load Methode übergeben. Anschließend können Sie die Assembly.GetType Methode verwenden, um Typen aus der Assembly zu laden. Siehe auch AssemblyName.ProcessorArchitecture.
Trennzeichen | Bedeutung |
---|---|
Umgekehrter Schrägstrich (\) | Escapezeichen. |
Backtick (') | Vor einem oder mehreren Ziffern, die die Anzahl der Typparameter darstellen, befindet sich am Ende des Namens eines generischen Typs. |
Klammern ([]) | Schließen Sie eine generische Typargumentliste für einen erstellten generischen Typ ein; schließen Sie innerhalb einer Typargumentliste einen assemblyqualifizierten Typ ein. |
Komma (,) | Vor dem Assemblynamen. |
Punkt (.) | Gibt Namespacebezeichner an. |
Pluszeichen (+) | Vor einer geschachtelten Klasse. |
Beispielsweise sieht der vollqualifizierte Name einer Klasse wie folgt aus:
TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly
Wenn der Namespace TopNamespace.Sub+Namespace war, muss die Zeichenfolge dem Pluszeichen (+) mit einem Escapezeichen (\+) vorausgehen, um zu verhindern, dass es als Verschachtelungstrennzeichen interpretiert wird. Die Spiegelung sendet diese Zeichenfolge wie folgt aus:
TopNamespace.Sub\+Namespace.ContainingClass+NestedClass,MyAssembly
Ein "++" wird "+", und ein "\" wird+\\ "\\".
Dieser qualifizierte Name kann beibehalten und später verwendet werden, um die Type. Verwenden Sie GetType zum Suchen und Laden eines TypeTyps entweder nur mit dem Namen des Typs oder mit dem assemblyqualifizierten Typnamen. GetType mit dem Typnamen sucht nur nach der Type Assembly des Aufrufers und dann in der Systemassembly. GetType mit dem Namen des qualifizierten Assemblytyps wird nach der Type Assembly in einer beliebigen Assembly gesucht.
Typnamen können nachgestellte Zeichen enthalten, die zusätzliche Informationen zum Typ angeben, z. B. ob der Typ ein Bezugstyp, ein Zeigertyp oder ein Arraytyp ist. Wenn Sie den Typnamen ohne diese nachgestellten Zeichen abrufen möchten, verwenden Sie t.GetElementType().ToString()
hier t
den Typ.
Leerzeichen sind in allen Typnamenkomponenten mit Ausnahme des Assemblynamens relevant. Im Assemblynamen sind Leerzeichen vor dem Trennzeichen "," relevant, aber Leerzeichen nach dem Trennzeichen "," werden ignoriert.
Der Name eines generischen Typs endet mit einem Backtick (`) gefolgt von Ziffern, die die Anzahl der generischen Typargumente darstellen. Der Zweck dieses Namensmanglings besteht darin, Compilern die Unterstützung generischer Typen mit demselben Namen zu ermöglichen, aber mit unterschiedlichen Zahlen von Typparametern, die im gleichen Bereich auftreten. Die Spiegelung gibt beispielsweise die gehandelten Namen Tuple`1
und Tuple`2
aus den generischen Methoden Tuple(Of T)
und Tuple(Of T0, T1)
in Visual Basic oder Tuple<T>
in Tuple<T0, T1>
Visual C# zurück.
Bei generischen Typen wird die Typargumentliste in Klammern eingeschlossen, und die Typargumente werden durch Kommas getrennt. Beispielsweise verfügt ein generisches Dictionary<TKey,TValue> Steuerelement über zwei Typparameter. Eine Dictionary<TKey,TValue> der MyType
Schlüssel des Typs String kann wie folgt dargestellt werden:
System.Collections.Generic.Dictionary`2[System.String,MyType]
Um einen assemblyqualifizierten Typ in einer Typargumentliste anzugeben, schließen Sie den assemblyqualifizierten Typ in Klammern ein. Andernfalls werden die Kommas, die die Teile des assemblyqualifizierten Namens trennen, als Trennzeichen zusätzlicher Typargumente interpretiert. Beispielsweise kann eine Dictionary<TKey,TValue> von MyType
MyAssembly.dll mit Schlüsseln vom Typ Stringwie folgt angegeben werden:
Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")
Hinweis
Ein assemblyqualifizierter Typ kann nur in Klammern eingeschlossen werden, wenn er in einer Typparameterliste angezeigt wird. Die Regeln für die Suche nach Assemblys für qualifizierte und nicht qualifizierte Typen in Typparameterlisten sind identisch mit den Regeln für qualifizierte und nichtgenerische Typen.
Nullfähige Typen sind ein Sonderfall generischer Typen. Beispielsweise wird eine Nullwerte Int32 durch die Zeichenfolge "System.Nullable'1[System.Int32]" dargestellt.
Hinweis
In C#, C++ und Visual Basic können Sie auch nullfähige Typen mithilfe von Typoperatoren abrufen. Der nullfähige Boolean Typ wird z. B. in C# Nullable<Boolean>::typeid
und in C++ und GetType(Nullable(Of Boolean))
in Visual Basic zurückgegebentypeof(Nullable<bool>)
.
In der folgenden Tabelle sind die Syntax aufgeführt, die Sie für verschiedene Typen verwenden GetType
.
So rufen Sie | Verwendung |
---|---|
Nullwerte Int32 | Type.GetType("System.Nullable`1[System.Int32]") |
Ein nicht verwalteter Zeiger auf MyType |
Type.GetType("MyType*") |
Ein nicht verwalteter Zeiger auf einen Zeiger auf MyType |
Type.GetType("MyType**") |
Ein verwalteter Zeiger oder Verweis auf MyType |
Type.GetType("MyType&") . Beachten Sie, dass Verweise im Gegensatz zu Zeigern auf eine Ebene beschränkt sind. |
Eine übergeordnete Klasse und eine geschachtelte Klasse | Type.GetType("MyParentClass+MyNestedClass") |
Ein eindimensionales Array mit einer unteren Grenze von 0 | Type.GetType("MyArray[]") |
Ein eindimensionales Array mit einer unbekannten Untergrenze | Type.GetType("MyArray[*]") |
Ein ndimensionales Array | Ein Komma (,) innerhalb der Klammern insgesamt n-1 mal. Stellt beispielsweise System.Object[,,] ein dreidimensionales Object Array dar. |
Array eines zweidimensionalen Arrays | Type.GetType("MyArray[][]") |
Ein rechteckiges zweidimensionales Array mit unbekannten Untergrenzen | Type.GetType("MyArray[,]") |
Ein generischer Typ mit einem Typargument | Type.GetType("MyGenericType`1[MyType]") |
Ein generischer Typ mit zwei Typargumenten | Type.GetType("MyGenericType`2[MyType,AnotherType]") |
Ein generischer Typ mit zwei assemblyqualifizierten Typargumenten | Type.GetType("MyGenericType`2[[MyType,MyAssembly],[AnotherType,AnotherAssembly]]") |
Ein assemblyqualifizierter generischer Typ mit einem assemblyqualifizierten Typargument | Type.GetType("MyGenericType`1[[MyType,MyAssembly]],MyGenericTypeAssembly") |
Ein generischer Typ, dessen Typargument ein generischer Typ mit zwei Typargumenten ist | Type.GetType("MyGenericType`1[AnotherGenericType`2[MyType,AnotherType]]") |
Siehe auch
- String
- TypeLoadException
- AssemblyQualifiedName
- GetAssembly(Type)
- GetType(String)
- AssemblyName
- Angeben vollständig gekennzeichneter Typnamen
Gilt für:
GetType(String, Boolean, Boolean)
Ruft den Type mit dem angegebenen Namen ab. Dabei wird angegeben, ob bei der Suche Groß- und Kleinschreibung berücksichtigt werden soll und ob eine Ausnahme ausgelöst werden soll, wenn der Typ nicht gefunden wird.
public:
static Type ^ GetType(System::String ^ typeName, bool throwOnError, bool ignoreCase);
public static Type GetType (string typeName, bool throwOnError, bool ignoreCase);
public static Type? GetType (string typeName, bool throwOnError, bool ignoreCase);
static member GetType : string * bool * bool -> Type
Public Shared Function GetType (typeName As String, throwOnError As Boolean, ignoreCase As Boolean) As Type
Parameter
- typeName
- String
Der durch die Assembly bezeichnete Name des abzurufenden Typs. Siehe AssemblyQualifiedName. Wenn sich der Typ in der aktuell ausgeführten Assembly oder mscorlib.dll/System.Private.CoreLib.dll befindet, ist eine Angabe des Typnamens einschließlich des qualifizierenden Namespace ausreichend.
- throwOnError
- Boolean
true
, damit eine Ausnahme ausgelöst wird, wenn der Typ nicht gefunden werden kann, false
, damit null
zurückgegeben wird. Die Angabe von false
unterdrückt auch einige andere Ausnahmebedingungen, aber nicht alle. Informationen finden Sie im Abschnitt für Ausnahmen.
- ignoreCase
- Boolean
true
, um ohne Beachtung der Groß-/Kleinschreibung nach typeName
zu suchen, false
, um mit Beachtung der Groß-/Kleinschreibung nach typeName
zu suchen.
Gibt zurück
Der Typ mit dem angegebenen Namen. Wenn der Typ nicht gefunden wird, gibt der throwOnError
-Parameter an, ob null
zurückgegeben oder eine Ausnahme ausgelöst wird. In einigen Fällen wird unabhängig vom Wert von throwOnError
eine Ausnahme ausgelöst. Informationen finden Sie im Abschnitt für Ausnahmen.
Ausnahmen
typeName
ist null
.
Ein Klasseninitialisierer wird aufgerufen und löst eine Ausnahme aus.
throwOnError
ist true
, und der Typ wurde nicht gefunden.
- oder -
throwOnError
ist true
, und typeName
enthält ungültige Zeichen, z. B. ein eingebettetes Tabstoppzeichen.
- oder -
throwOnError
ist true
, und typeName
ist eine leere Zeichenfolge.
- oder -
throwOnError
ist true
, und typeName
stellt einen Arraytyp mit einer ungültigen Größe dar.
- oder -
typeName
stellt ein Array von TypedReference dar.
throwOnError
ist true
, und typeName
enthält ungültige Syntax, beispielsweise "MyType[,*,]".
- oder -
typeName
stellt einen generischen Typ dar, der einen Zeigertyp, einen ByRef
-Typ oder Void als eines seiner Typargumente aufweist.
- oder -
typeName
stellt einen generischen Typ dar, der eine falsche Anzahl von Typargumenten aufweist.
- oder -
typeName
stellt einen generischen Typ dar, und eines seiner Typargumente erfüllt nicht die Einschränkungen für den entsprechenden Typparameter.
throwOnError
ist true
, und die Assembly oder eine der zugehörigen Abhängigkeiten wurde nicht gefunden.
Die Assembly oder eine der zugehörigen Abhängigkeiten wurde gefunden, konnte aber nicht geladen werden.
Die Assembly oder eine der zugehörigen Abhängigkeiten ist ungültig.
- oder -
Version 2.0 oder höher der Common Language Runtime ist derzeit geladen, und die Assembly wurde mit einer höheren Version kompiliert.
Hinweise
Sie können die GetType Methode verwenden, um ein Objekt für einen Type Typ in einer anderen Assembly abzurufen, wenn Sie den assemblyqualifizierten Namen kennen, der von AssemblyQualifiedName. GetType verursacht das Laden der in typeName
. Sie können eine Assembly auch mithilfe der Assembly.Load Methode laden und dann die Assembly.GetType Oder-Methode Assembly.GetTypes verwenden, um Objekte abzurufen Type . Wenn sich ein Typ zur Kompilierungszeit in einer Assembly befindet, die ihrem Programm zur Kompilierung bekannt ist, ist es effizienter, in C# oder dem GetType
Operator in Visual Basic zu verwendentypeof
.
GetType
Funktioniert nur auf Assemblys, die vom Datenträger geladen wurden. Wenn Sie einen typ aufrufen GetType
, der in einer dynamischen Assembly definiert ist, die mithilfe der System.Reflection.Emit Dienste definiert ist, wird möglicherweise ein inkonsistentes Verhalten angezeigt. Das Verhalten hängt davon ab, ob die dynamische Assembly beständig ist, d. h. mithilfe der RunAndSave
Modi oder Save
des Zugriffsmodus der System.Reflection.Emit.AssemblyBuilderAccess Enumeration erstellt wird. Wenn die dynamische Assembly beständig ist und vor GetType
dem Aufrufen in den Datenträger geschrieben wurde, findet der Ladeer die gespeicherte Assembly auf dem Datenträger, lädt diese Assembly und ruft den Typ aus dieser Assembly ab. Wenn die Assembly nicht auf dem Datenträger gespeichert wurde, wenn GetType
sie aufgerufen wird, gibt die Methode zurück null
. GetType
versteht keine vorübergehenden dynamischen Assemblys; Daher gibt das Aufrufen GetType
eines Typs in einer vorübergehenden dynamischen Assembly zurück null
.
Wenn Sie für ein dynamisches Modul verwenden möchten GetType
, abonnieren Sie das AppDomain.AssemblyResolve Ereignis und rufen Sie an GetType
, bevor Sie speichern. Andernfalls erhalten Sie zwei Kopien der Assembly im Arbeitsspeicher.
Der throwOnError
Parameter gibt an, was geschieht, wenn der Typ nicht gefunden wird, und unterdrückt auch bestimmte andere Ausnahmebedingungen, wie im Abschnitt "Ausnahmen" beschrieben. Einige Ausnahmen werden unabhängig vom Wert von throwOnError
. Wenn der Typ z. B. gefunden, aber nicht geladen werden kann, wird eine TypeLoadException auch dann ausgelöst, wenn throwOnError
es sich um einen Wert handelt false
.
In der folgenden Tabelle wird gezeigt, welche Elemente einer Basisklasse durch die Get
Methoden zurückgegeben werden, wenn sie einen Typ widerspiegeln.
Memberart | statischen | Nicht statischer |
---|---|---|
Konstruktor | Nein | Nein |
Feld | Nein | Ja. Ein Feld ist immer ausgeblendet nach Name und Signatur. |
Ereignis | Nicht zutreffend | Die allgemeine Typsystemregel besteht darin, dass die Vererbung identisch mit den Methoden ist, die die Eigenschaft implementieren. Die Spiegelung behandelt Eigenschaften als Ausblenden nach Name und Signatur. Siehe Hinweis 2 unten. |
Methode | Nein | Ja. Eine Methode (sowohl virtuelle als auch nicht virtuelle) kann nach Name oder Ausblenden nach Name und Signatur ausgeblendet werden. |
Geschachtelter Typ | Nein | Nein |
Eigenschaft | Nicht zutreffend | Die allgemeine Typsystemregel besteht darin, dass die Vererbung identisch mit den Methoden ist, die die Eigenschaft implementieren. Die Spiegelung behandelt Eigenschaften als Ausblenden nach Name und Signatur. Siehe Hinweis 2 unten. |
Hide-by-name-and-signature betrachtet alle Teile der Signatur, einschließlich benutzerdefinierter Modifizierer, Rückgabetypen, Parametertypen, Sentinels und nicht verwaltete Aufrufkonventionen. Dies ist ein binärer Vergleich.
Für die Spiegelung werden Eigenschaften und Ereignisse nach Name und Signatur ausgeblendet. Wenn Sie über eine Eigenschaft mit einem Get- und einem Set-Accessor in der Basisklasse verfügen, aber die abgeleitete Klasse nur einen Get-Accessor hat, blendet die abgeleitete Klasseneigenschaft die Basisklasse-Eigenschaft aus, und Sie können nicht auf den Setter auf die Basisklasse zugreifen.
Benutzerdefinierte Attribute sind nicht Teil des allgemeinen Typsystems.
Arrays oder COM-Typen werden nicht gesucht, es sei denn, sie wurden bereits in die Tabelle der verfügbaren Klassen geladen.
typeName
kann der Typname sein, der durch seinen Namespace oder einen assemblyqualifizierten Namen qualifiziert ist, der eine Assemblynamenspezifikation enthält. Siehe AssemblyQualifiedName.
Wenn typeName
der Namespace, aber nicht der Assemblyname enthalten ist, durchsucht diese Methode nur die Assembly des aufrufenden Objekts und mscorlib.dll/System.Private.CoreLib.dll in dieser Reihenfolge. Wenn typeName vollständig mit dem Namen der teilweisen oder vollständigen Assembly qualifiziert ist, sucht diese Methode in der angegebenen Assembly. Wenn die Assembly über einen starken Namen verfügt, ist ein vollständiger Assemblyname erforderlich.
Die AssemblyQualifiedName Eigenschaft gibt einen vollqualifizierten Typnamen zurück, einschließlich geschachtelter Typen, des Assemblynamens und der Typargumente. Alle Compiler, die die allgemeine Sprachlaufzeit unterstützen, geben den einfachen Namen einer geschachtelten Klasse aus, und die Spiegelung erstellt einen manglierten Namen, wenn abgefragt wird, gemäß den folgenden Konventionen.
Hinweis
In der .NET Framework Version 2.0 wird die Prozessorarchitektur zur Assemblyidentität hinzugefügt und kann als Teil der Assemblynamenzeichenfolgen angegeben werden. Beispiel: "ProcessorArchitecture=msil". Es ist jedoch nicht in die von der AssemblyQualifiedName Eigenschaft zurückgegebene Zeichenfolge enthalten, aus Kompatibilitätsgründen. Sie können auch Typen laden, indem Sie ein AssemblyName Objekt erstellen und an eine entsprechende Überladung der Load Methode übergeben. Anschließend können Sie die Assembly.GetType Methode verwenden, um Typen aus der Assembly zu laden. Siehe auch AssemblyName.ProcessorArchitecture.
Trennzeichen | Bedeutung |
---|---|
Umgekehrter Schrägstrich (\) | Escapezeichen. |
Backtick (') | Vor einem oder mehreren Ziffern, die die Anzahl der Typparameter darstellen, befindet sich am Ende des Namens eines generischen Typs. |
Klammern ([]) | Schließen Sie eine generische Typargumentliste für einen erstellten generischen Typ ein; schließen Sie innerhalb einer Typargumentliste einen assemblyqualifizierten Typ ein. |
Komma (,) | Vor dem Assemblynamen. |
Punkt (.) | Gibt Namespacebezeichner an. |
Pluszeichen (+) | Vor einer geschachtelten Klasse. |
Beispielsweise sieht der vollqualifizierte Name einer Klasse wie folgt aus:
TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly
Wenn der Namespace TopNamespace.Sub+Namespace war, muss die Zeichenfolge dem Pluszeichen (+) mit einem Escapezeichen (\+) vorausgehen, um zu verhindern, dass es als Verschachtelungstrennzeichen interpretiert wird. Die Spiegelung sendet diese Zeichenfolge wie folgt aus:
TopNamespace.Sub\+Namespace.ContainingClass+NestedClass,MyAssembly
Ein "++" wird "+", und ein "\" wird+\\ "\\".
Dieser qualifizierte Name kann beibehalten und später verwendet werden, um das Laden des Type. Um nach einem TypeTyp zu suchen und zu laden, verwenden Sie GetType entweder nur den Typnamen oder den assemblyqualifizierten Typnamen. GetType mit dem Typnamen sucht nur nach Type der Assembly des Anrufers und dann in der Systemassembly. GetType mit dem Namen des qualifizierten Assemblytyps sucht nach der Type in jeder Assembly enthaltenen Assembly.
Typnamen können nachgestellte Zeichen enthalten, die zusätzliche Informationen zum Typ angeben, z. B. ob der Typ ein Referenztyp, ein Zeigertyp oder ein Arraytyp ist. Um den Typnamen ohne diese nachgestellten Zeichen abzurufen, verwenden Sie t.GetElementType().ToString()
, wo t
der Typ ist.
Leerzeichen sind in allen Typnamenkomponenten mit Ausnahme des Assemblynamens relevant. Im Assemblynamen sind Leerzeichen vor dem Trennzeichen "," relevant, aber Leerzeichen nach dem Trennzeichen '', werden ignoriert.
Der Name eines generischen Typs endet mit einem Backtick (`) gefolgt von Ziffern, die die Anzahl der generischen Typargumente darstellen. Der Zweck dieses Namens mangling besteht darin, Compilern die Unterstützung generischer Typen mit demselben Namen zu ermöglichen, aber mit unterschiedlichen Zahlen von Typparametern, die im gleichen Bereich auftreten. Die Spiegelung gibt beispielsweise die manglierten Namen Tuple`1
und aus den generischen Methoden Tuple(Of T)
und Tuple`2
Tuple(Of T0, T1)
in Visual Basic oder Tuple<T>
Tuple<T0, T1>
in Visual C# zurück.
Bei generischen Typen wird die Typargumentliste in Klammern eingeschlossen, und die Typargumente werden durch Kommas getrennt. Beispielsweise verfügt ein generisches Steuerelement Dictionary<TKey,TValue> über zwei Typparameter. Eine Dictionary<TKey,TValue> der Schlüssel des MyType
Typs String kann wie folgt dargestellt werden:
System.Collections.Generic.Dictionary`2[System.String,MyType]
Um einen assemblyqualifizierten Typ in einer Typargumentliste anzugeben, schließen Sie den assemblyqualifizierten Typ in Klammern ein. Andernfalls werden die Kommas, die die Teile des assemblyqualifizierten Namens trennen, als Trennzeichen für zusätzliche Typargumente interpretiert. Beispielsweise kann eine Dictionary<TKey,TValue> von MyAssembly.dll mit Schlüsseln des MyType
Typs Stringwie folgt angegeben werden:
Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")
Hinweis
Ein assemblyqualifizierter Typ kann nur in Klammern eingeschlossen werden, wenn er in einer Typparameterliste angezeigt wird. Die Regeln für die Suche nach Assemblys für qualifizierte und nicht qualifizierte Typen in Typparameterlisten entsprechen den Regeln für qualifizierte und nichtgenerische Typen.
Nullable-Typen sind ein besonderer Fall von generischen Typen. Beispielsweise wird eine Nullable Int32 durch die Zeichenfolge "System.Nullable'1[System.Int32]" dargestellt.
Hinweis
In C#, C++und Visual Basic können Sie auch nullable Typen mithilfe von Typoperatoren abrufen. Der Nullable-Typ Boolean wird z. B. in typeof(Nullable<bool>)
C#, in Nullable<Boolean>::typeid
C++und GetType(Nullable(Of Boolean))
in Visual Basic zurückgegeben.
Die folgende Tabelle zeigt die Syntax, die Sie für GetType
verschiedene Typen verwenden.
So erhalten Sie | Verwendung |
---|---|
Nullwert Int32 | Type.GetType("System.Nullable`1[System.Int32]") |
Ein nicht verwalteter Zeiger auf MyType |
Type.GetType("MyType*") |
Ein nicht verwalteter Zeiger auf einen Zeiger zu einem Zeiger MyType |
Type.GetType("MyType**") |
Ein verwalteter Zeiger oder Verweis auf MyType |
Type.GetType("MyType&") . Beachten Sie, dass Verweise im Gegensatz zu Zeigern auf eine Ebene beschränkt sind. |
Eine übergeordnete Klasse und eine geschachtelte Klasse | Type.GetType("MyParentClass+MyNestedClass") |
Ein eindimensionales Array mit einer unteren Grenze von 0 | Type.GetType("MyArray[]") |
Ein eindimensionales Array mit einer unbekannten unteren Grenze | Type.GetType("MyArray[*]") |
Ein ndimensionales Array | Ein Komma (,) innerhalb der Klammern insgesamt n-1 mal. Stellt beispielsweise System.Object[,,] ein dreidimensionales Object Array dar. |
Array eines zweidimensionalen Arrays | Type.GetType("MyArray[][]") |
Ein rechteckiges zweidimensionales Array mit unbekannten Untergrenzen | Type.GetType("MyArray[,]") |
Ein generischer Typ mit einem Typargument | Type.GetType("MyGenericType`1[MyType]") |
Ein generischer Typ mit zwei Typargumenten | Type.GetType("MyGenericType`2[MyType,AnotherType]") |
Ein generischer Typ mit zwei assemblyqualifizierten Typargumenten | Type.GetType("MyGenericType`2[[MyType,MyAssembly],[AnotherType,AnotherAssembly]]") |
Ein assemblyqualifizierter generischer Typ mit einem assemblyqualifizierten Typargument | Type.GetType("MyGenericType`1[[MyType,MyAssembly]],MyGenericTypeAssembly") |
Ein generischer Typ, dessen Typargument ein generischer Typ mit zwei Typargumenten ist | Type.GetType("MyGenericType`1[AnotherGenericType`2[MyType,AnotherType]]") |
Siehe auch
- String
- TypeLoadException
- AssemblyQualifiedName
- GetAssembly(Type)
- GetType(String)
- AssemblyName
- Angeben vollständig gekennzeichneter Typnamen
Gilt für:
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>)
Ruft den Typ mit dem angegebenen Namen ab und stellt optional benutzerdefinierte Methoden bereit, um die Assembly und den Typ aufzulösen.
public:
static Type ^ GetType(System::String ^ typeName, Func<System::Reflection::AssemblyName ^, System::Reflection::Assembly ^> ^ assemblyResolver, Func<System::Reflection::Assembly ^, System::String ^, bool, Type ^> ^ typeResolver);
public static Type? GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver);
public static Type GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly> assemblyResolver, Func<System.Reflection.Assembly,string,bool,Type> typeResolver);
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> -> Type
Public Shared Function GetType (typeName As String, assemblyResolver As Func(Of AssemblyName, Assembly), typeResolver As Func(Of Assembly, String, Boolean, Type)) As Type
Parameter
- typeName
- String
Der Name des abzurufenden Typs. Wenn der typeResolver
-Parameter bereitgestellt wird, kann der Typname jede Zeichenfolge sein, die vom typeResolver
aufgelöst werden kann. Wenn der assemblyResolver
-Parameter bereitgestellt wird oder wenn die Standardtypauflösung verwendet wird, muss typeName
ein durch die Assembly qualifizierter Name (siehe AssemblyQualifiedName-Eigenschaft) sein, es sei denn, der Typ befindet sich in der gerade ausgeführten Assembly oder in mscorlib.dll/System.Private.CoreLib.dll. In diesem Fall genügt es, den von seinem Namespace qualifizierten Typnamen anzugeben.
- assemblyResolver
- Func<AssemblyName,Assembly>
Eine Methode, die die Assembly sucht und zurückgibt, die in typeName
angegeben wird. Der Assemblyname wird an den assemblyResolver
als ein AssemblyName-Objekt übergeben. Wenn typeName
keinen Namen einer Assembly enthält, wird der assemblyResolver
nicht aufgerufen. Wenn der assemblyResolver
nicht angegeben wird, wird die Standardassemblyauflösung ausgeführt.
Vorsicht Übergeben Sie keine Methoden von unbekannten oder nicht vertrauenswürdigen Aufrufern. Andernfalls könnten Berechtigungen für bösartigen Code erweitert werden. Verwenden Sie nur Methoden, die Sie bereitstellen oder mit denen Sie vertraut sind.
Eine Methode, die den Typ sucht und zurückgibt, der von typeName
von der Assembly angegeben wird, die vom assemblyResolver
oder von der Standardassemblyauflösung zurückgegeben wird. Wenn keine Assembly bereitgestellt wird, kann die typeResolver
-Methode eine Assembly zur Verfügung stellen. Die Methode nimmt auch einen Parameter an, der angibt, ob bei der Suche die Groß- und Kleinschreibung berücksichtigt werden soll; an diesen Parameter wird false
übergeben.
Vorsicht Übergeben Sie keine Methoden von unbekannten oder nicht vertrauenswürdigen Aufrufern.
Gibt zurück
Der Typ mit dem angegebenen Namen oder null
, wenn der Typ nicht gefunden wird.
Ausnahmen
typeName
ist null
.
Ein Klasseninitialisierer wird aufgerufen und löst eine Ausnahme aus.
Ein Fehler tritt auf, wenn typeName
in einen Typnamen und einen Assemblynamen zerlegt wird (wenn z. B. der einfache Typname ein Sonderzeichen ohne Escapezeichen enthält).
- oder -
typeName
stellt einen generischen Typ dar, der einen Zeigertyp, einen ByRef
-Typ oder Void als eines seiner Typargumente aufweist.
- oder -
typeName
stellt einen generischen Typ dar, der eine falsche Anzahl von Typargumenten aufweist.
- oder -
typeName
stellt einen generischen Typ dar, und eines seiner Typargumente erfüllt nicht die Einschränkungen für den entsprechenden Typparameter.
typeName
stellt ein Array von TypedReference dar.
Die Assembly oder eine der zugehörigen Abhängigkeiten wurde gefunden, konnte aber nicht geladen werden.
- oder -
typeName
enthält einen ungültigen Assemblynamen.
- oder -
typeName
ist ein gültiger Assemblyname ohne Typnamen.
Die Assembly oder eine der zugehörigen Abhängigkeiten ist ungültig.
- oder -
Die Assembly wurde mit einer Version der Common Language Runtime kompiliert, die höher ist als die Version, die derzeit geladen ist.
Hinweise
Verwendungsszenarien für diese Methode und Details zu den assemblyResolver
typeResolver
Parametern finden Sie in der GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) Methodenüberladung.
Hinweis
Wenn typeName
nicht gefunden werden kann, gibt der Aufruf der GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) Methode zurück null
. Es löst keine Ausnahme aus. Rufen Sie eine Überladung der GetType Methode mit einem throwOnError
Parameter auf, um zu steuern, ob eine Ausnahme ausgelöst wird.
Das Aufrufen dieser Methodenüberladung entspricht dem Aufrufen der GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) Methodenüberladung und der Angabe false
für die und ignoreCase
die throwOnError
Parameter.
Gilt für:
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)
Ruft den Typ mit dem angegebenen Namen ab. Dabei wird angegeben, ob eine Ausnahme ausgelöst werden soll, wenn der Typ nicht gefunden wird, und optional werden benutzerdefinierte Methoden bereitgestellt, um die Assembly und den Typ aufzulösen.
public:
static Type ^ GetType(System::String ^ typeName, Func<System::Reflection::AssemblyName ^, System::Reflection::Assembly ^> ^ assemblyResolver, Func<System::Reflection::Assembly ^, System::String ^, bool, Type ^> ^ typeResolver, bool throwOnError);
public static Type? GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver, bool throwOnError);
public static Type GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly> assemblyResolver, Func<System.Reflection.Assembly,string,bool,Type> typeResolver, bool throwOnError);
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> * bool -> Type
Public Shared Function GetType (typeName As String, assemblyResolver As Func(Of AssemblyName, Assembly), typeResolver As Func(Of Assembly, String, Boolean, Type), throwOnError As Boolean) As Type
Parameter
- typeName
- String
Der Name des abzurufenden Typs. Wenn der typeResolver
-Parameter bereitgestellt wird, kann der Typname jede Zeichenfolge sein, die vom typeResolver
aufgelöst werden kann. Wenn der assemblyResolver
-Parameter bereitgestellt wird oder wenn die Standardtypauflösung verwendet wird, muss typeName
ein durch die Assembly qualifizierter Name (siehe AssemblyQualifiedName-Eigenschaft) sein, es sei denn, der Typ befindet sich in der gerade ausgeführten Assembly oder in mscorlib.dll/System.Private.CoreLib.dll. In diesem Fall genügt es, den von seinem Namespace qualifizierten Typnamen anzugeben.
- assemblyResolver
- Func<AssemblyName,Assembly>
Eine Methode, die die Assembly sucht und zurückgibt, die in typeName
angegeben wird. Der Assemblyname wird an den assemblyResolver
als ein AssemblyName-Objekt übergeben. Wenn typeName
keinen Namen einer Assembly enthält, wird der assemblyResolver
nicht aufgerufen. Wenn der assemblyResolver
nicht angegeben wird, wird die Standardassemblyauflösung ausgeführt.
Vorsicht Übergeben Sie keine Methoden von unbekannten oder nicht vertrauenswürdigen Aufrufern. Andernfalls könnten Berechtigungen für bösartigen Code erweitert werden. Verwenden Sie nur Methoden, die Sie bereitstellen oder mit denen Sie vertraut sind.
Eine Methode, die den Typ sucht und zurückgibt, der von typeName
von der Assembly angegeben wird, die vom assemblyResolver
oder von der Standardassemblyauflösung zurückgegeben wird. Wenn keine Assembly bereitgestellt wird, kann die Methode eine Assembly zur Verfügung stellen. Die Methode nimmt auch einen Parameter an, der angibt, ob bei der Suche die Groß- und Kleinschreibung berücksichtigt werden soll; an diesen Parameter wird false
übergeben.
Vorsicht Übergeben Sie keine Methoden von unbekannten oder nicht vertrauenswürdigen Aufrufern.
- throwOnError
- Boolean
true
, damit eine Ausnahme ausgelöst wird, wenn der Typ nicht gefunden werden kann, false
, damit null
zurückgegeben wird. Die Angabe von false
unterdrückt auch einige andere Ausnahmebedingungen, aber nicht alle. Informationen finden Sie im Abschnitt für Ausnahmen.
Gibt zurück
Der Typ mit dem angegebenen Namen. Wenn der Typ nicht gefunden wird, gibt der throwOnError
-Parameter an, ob null
zurückgegeben oder eine Ausnahme ausgelöst wird. In einigen Fällen wird unabhängig vom Wert von throwOnError
eine Ausnahme ausgelöst. Informationen finden Sie im Abschnitt für Ausnahmen.
Ausnahmen
typeName
ist null
.
Ein Klasseninitialisierer wird aufgerufen und löst eine Ausnahme aus.
throwOnError
ist true
, und der Typ wurde nicht gefunden.
- oder -
throwOnError
ist true
, und typeName
enthält ungültige Zeichen, z. B. ein eingebettetes Tabstoppzeichen.
- oder -
throwOnError
ist true
, und typeName
ist eine leere Zeichenfolge.
- oder -
throwOnError
ist true
, und typeName
stellt einen Arraytyp mit einer ungültigen Größe dar.
- oder -
typeName
stellt ein Array von TypedReference dar.
Ein Fehler tritt auf, wenn typeName
in einen Typnamen und einen Assemblynamen zerlegt wird (wenn z. B. der einfache Typname ein Sonderzeichen ohne Escapezeichen enthält).
- oder -
throwOnError
ist true
und typeName
enthält ungültige Syntax (z. B. „MyType[,*,]“).
- oder -
typeName
stellt einen generischen Typ dar, der einen Zeigertyp, einen ByRef
-Typ oder Void als eines seiner Typargumente aufweist.
- oder -
typeName
stellt einen generischen Typ dar, der eine falsche Anzahl von Typargumenten aufweist.
- oder -
typeName
stellt einen generischen Typ dar, und eines seiner Typargumente erfüllt nicht die Einschränkungen für den entsprechenden Typparameter.
throwOnError
ist true
, und die Assembly oder eine der zugehörigen Abhängigkeiten wurde nicht gefunden.
- oder -
typeName
enthält einen ungültigen Assemblynamen.
- oder -
typeName
ist ein gültiger Assemblyname ohne Typnamen.
Die Assembly oder eine der zugehörigen Abhängigkeiten wurde gefunden, konnte aber nicht geladen werden.
Die Assembly oder eine der zugehörigen Abhängigkeiten ist ungültig.
- oder -
Die Assembly wurde mit einer Version der Common Language Runtime kompiliert, die höher ist als die Version, die derzeit geladen ist.
Hinweise
Verwendungsszenarien für diese Methode und Details zu den assemblyResolver
typeResolver
Parametern finden Sie in der GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) Methodenüberladung.
Das Aufrufen dieser Methodenüberladung entspricht dem Aufrufen der GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) Methodenüberladung und der Angabe false
für den ignoreCase
Parameter.
Gilt für:
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean)
Ruft den Typ mit dem angegebenen Namen ab. Dabei wird angegeben, ob bei der Suche die Groß-/Kleinschreibung beachtet werden soll und ob eine Ausnahme ausgelöst werden soll, wenn der Typ nicht gefunden wird, und optional werden benutzerdefinierte Methoden bereitgestellt, um die Assembly und den Typ aufzulösen.
public:
static Type ^ GetType(System::String ^ typeName, Func<System::Reflection::AssemblyName ^, System::Reflection::Assembly ^> ^ assemblyResolver, Func<System::Reflection::Assembly ^, System::String ^, bool, Type ^> ^ typeResolver, bool throwOnError, bool ignoreCase);
public static Type? GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver, bool throwOnError, bool ignoreCase);
public static Type GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly> assemblyResolver, Func<System.Reflection.Assembly,string,bool,Type> typeResolver, bool throwOnError, bool ignoreCase);
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> * bool * bool -> Type
Public Shared Function GetType (typeName As String, assemblyResolver As Func(Of AssemblyName, Assembly), typeResolver As Func(Of Assembly, String, Boolean, Type), throwOnError As Boolean, ignoreCase As Boolean) As Type
Parameter
- typeName
- String
Der Name des abzurufenden Typs. Wenn der typeResolver
-Parameter bereitgestellt wird, kann der Typname jede Zeichenfolge sein, die vom typeResolver
aufgelöst werden kann. Wenn der assemblyResolver
-Parameter bereitgestellt wird oder wenn die Standardtypauflösung verwendet wird, muss typeName
ein durch die Assembly qualifizierter Name (siehe AssemblyQualifiedName-Eigenschaft) sein, es sei denn, der Typ befindet sich in der gerade ausgeführten Assembly oder in mscorlib.dll/System.Private.CoreLib.dll. In diesem Fall genügt es, den von seinem Namespace qualifizierten Typnamen anzugeben.
- assemblyResolver
- Func<AssemblyName,Assembly>
Eine Methode, die die Assembly sucht und zurückgibt, die in typeName
angegeben wird. Der Assemblyname wird an den assemblyResolver
als ein AssemblyName-Objekt übergeben. Wenn typeName
keinen Namen einer Assembly enthält, wird der assemblyResolver
nicht aufgerufen. Wenn der assemblyResolver
nicht angegeben wird, wird die Standardassemblyauflösung ausgeführt.
Vorsicht Übergeben Sie keine Methoden von unbekannten oder nicht vertrauenswürdigen Aufrufern. Andernfalls könnten Berechtigungen für bösartigen Code erweitert werden. Verwenden Sie nur Methoden, die Sie bereitstellen oder mit denen Sie vertraut sind.
Eine Methode, die den Typ sucht und zurückgibt, der von typeName
von der Assembly angegeben wird, die vom assemblyResolver
oder von der Standardassemblyauflösung zurückgegeben wird. Wenn keine Assembly bereitgestellt wird, kann die Methode eine Assembly zur Verfügung stellen. Die Methode nimmt auch einen Parameter an, der angibt, ob bei der Suche die Groß-/Kleinschreibung beachtet werden soll; an diesen Parameter wird der Wert von ignoreCase
übergeben.
Vorsicht Übergeben Sie keine Methoden von unbekannten oder nicht vertrauenswürdigen Aufrufern.
- throwOnError
- Boolean
true
, damit eine Ausnahme ausgelöst wird, wenn der Typ nicht gefunden werden kann, false
, damit null
zurückgegeben wird. Die Angabe von false
unterdrückt auch einige andere Ausnahmebedingungen, aber nicht alle. Informationen finden Sie im Abschnitt für Ausnahmen.
- ignoreCase
- Boolean
true
, um ohne Beachtung der Groß-/Kleinschreibung nach typeName
zu suchen, false
, um mit Beachtung der Groß-/Kleinschreibung nach typeName
zu suchen.
Gibt zurück
Der Typ mit dem angegebenen Namen. Wenn der Typ nicht gefunden wird, gibt der throwOnError
-Parameter an, ob null
zurückgegeben oder eine Ausnahme ausgelöst wird. In einigen Fällen wird unabhängig vom Wert von throwOnError
eine Ausnahme ausgelöst. Informationen finden Sie im Abschnitt für Ausnahmen.
Ausnahmen
typeName
ist null
.
Ein Klasseninitialisierer wird aufgerufen und löst eine Ausnahme aus.
throwOnError
ist true
, und der Typ wurde nicht gefunden.
- oder -
throwOnError
ist true
, und typeName
enthält ungültige Zeichen, z. B. ein eingebettetes Tabstoppzeichen.
- oder -
throwOnError
ist true
, und typeName
ist eine leere Zeichenfolge.
- oder -
throwOnError
ist true
, und typeName
stellt einen Arraytyp mit einer ungültigen Größe dar.
- oder -
typeName
stellt ein Array von TypedReference dar.
Ein Fehler tritt auf, wenn typeName
in einen Typnamen und einen Assemblynamen zerlegt wird (wenn z. B. der einfache Typname ein Sonderzeichen ohne Escapezeichen enthält).
- oder -
throwOnError
ist true
und typeName
enthält ungültige Syntax (z. B. „MyType[,*,]“).
- oder -
typeName
stellt einen generischen Typ dar, der einen Zeigertyp, einen ByRef
-Typ oder Void als eines seiner Typargumente aufweist.
- oder -
typeName
stellt einen generischen Typ dar, der eine falsche Anzahl von Typargumenten aufweist.
- oder -
typeName
stellt einen generischen Typ dar, und eines seiner Typargumente erfüllt nicht die Einschränkungen für den entsprechenden Typparameter.
throwOnError
ist true
, und die Assembly oder eine der zugehörigen Abhängigkeiten wurde nicht gefunden.
Die Assembly oder eine der zugehörigen Abhängigkeiten wurde gefunden, konnte aber nicht geladen werden.
- oder -
typeName
enthält einen ungültigen Assemblynamen.
- oder -
typeName
ist ein gültiger Assemblyname ohne Typnamen.
Die Assembly oder eine der zugehörigen Abhängigkeiten ist ungültig.
- oder -
Die Assembly wurde mit einer Version der Common Language Runtime kompiliert, die höher ist als die Version, die derzeit geladen ist.
Hinweise
Verwenden Sie diese Methodenüberladung und die zugeordneten Überladungen (GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) und GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)) zum Ersetzen der Standardimplementierung der GetType Methode durch flexiblere Implementierungen. Indem Sie ihre eigenen Methoden bereitstellen, die Typnamen und die Namen der Assemblys auflösen, die sie enthalten, können Sie folgendes ausführen:
Steuern Sie, aus welcher Version einer Assembly ein Typ geladen wird.
Stellen Sie einen anderen Ort bereit, um nach einem Typnamen zu suchen, der keinen Assemblynamen enthält.
Laden Sie Assemblys mithilfe von Teilassemblynamen.
Zurückgeben von Unterklassen System.Type , die nicht von der allgemeinen Sprachlaufzeit (CLR) erstellt werden.
In der versiontoleranten Serialisierung können Sie beispielsweise mithilfe eines Teilnamens nach einer "best fit"-Assembly suchen. Andere Überladungen der GetType Methode erfordern einen assemblyqualifizierten Typnamen, der die Versionsnummer enthält.
Alternative Implementierungen des Typsystems müssen möglicherweise Unterklassen zurückgeben, die nicht vom CLR erstellt werden. Alle Typen, die von anderen Überladungen System.Type der GetType Methode zurückgegeben werden, sind Laufzeittypen.
Verwendungsnotizen
Diese Methodenüberladung und die zugeordneten Überladungen analysieren typeName
den Namen eines Typs und den Namen einer Assembly und lösen dann die Namen. Die Auflösung des Assemblynamens tritt vor der Auflösung des Typnamens auf, da ein Typname im Kontext einer Assembly aufgelöst werden muss.
Hinweis
Wenn Sie nicht mit dem Konzept von Assemblyqualifizierten Typnamen vertraut sind, lesen Sie die AssemblyQualifiedName Eigenschaft.
Wenn typeName
es sich nicht um einen assemblyqualifizierten Namen handelt, wird die Assemblyauflösung übersprungen. Nicht qualifizierte Typnamen können im Kontext von mscorlib.dll/System.Private.CoreLib.dll oder der derzeit ausgeführten Assembly aufgelöst werden, oder Sie können optional eine Assembly im typeResolver
Parameter bereitstellen. Die Effekte, die den Assemblynamen für verschiedene Arten der Namensauflösung einschließen oder auslassen, werden als Tabelle im Abschnitt "Mixed Name Resolution " angezeigt.
Allgemeine Nutzungsnotizen:
Übergeben Sie keine Methoden an
assemblyResolver
odertypeResolver
wenn sie von unbekannten oder nicht vertrauenswürdigen Aufrufern stammen. Verwenden Sie nur Methoden, die Sie bereitstellen oder mit denen Sie vertraut sind.Achtung
Die Verwendung von Methoden aus unbekannten oder nicht vertrauenswürdigen Anrufern könnte zu einer Erhöhung der Berechtigungen für böswilligen Code führen.
Wenn Sie die
assemblyResolver
Und/odertypeResolver
Parameter auslassen, wird der Wert desthrowOnError
Parameters an die Methoden übergeben, die die Standardauflösung ausführen.Wenn
throwOnError
dies der Fall isttrue
, löst diese Methode einen TypeLoadException Wann-RückgabetypeResolver
null
- und einen FileNotFoundException Wann-WertassemblyResolver
null
aus.Diese Methode erfasst keine Ausnahmen, die von
assemblyResolver
undtypeResolver
. Sie sind für alle Ausnahmen verantwortlich, die von den Lösungsmethoden ausgelöst werden.
Auflösen von Assemblys
Die assemblyResolver
Methode empfängt ein AssemblyName Objekt, das durch analysieren des Zeichenfolgenassemblynamens erstellt wird, der in typeName
. Wenn typeName
kein Assemblyname enthalten ist, assemblyResolver
wird nicht aufgerufen und null
an typeResolver
.
Wenn assemblyResolver
nicht angegeben wird, wird die Standardassembly-Probing verwendet, um die Assembly zu finden. Wenn assemblyResolver
die Methode bereitgestellt wird, wird die GetType Methode nicht standardmäßig ausgeführt. In diesem Fall müssen Sie sicherstellen, dass Sie assemblyResolver
alle Assemblys behandeln können, die Sie an sie übergeben.
Die Methode sollte zurückgegeben null
werden, wenn die assemblyResolver
Assembly nicht aufgelöst werden kann. Wenn assemblyResolver
die Rückgabe typeResolver
null
nicht aufgerufen wird und keine weitere Verarbeitung auftritt. Darüber hinaus throwOnError
true
wird ein FileNotFoundException Wurf ausgelöst.
Wenn das AssemblyName übergeben assemblyResolver
wird, ist ein Teilname, eine oder mehrere seiner Teile.null
Wenn beispielsweise keine Version vorhanden ist, lautet null
die Version Eigenschaft . Wenn die Eigenschaft, die Version CultureInfo Eigenschaft und die GetPublicKeyToken Methode alle zurückgegeben null
werden, wird nur der einfache Name der Assembly angegeben. Die assemblyResolver
Methode kann alle Teile des Assemblynamens verwenden oder ignorieren.
Die Effekte verschiedener Assemblyauflösungsoptionen werden als Tabelle im Abschnitt " Mixed Name Resolution " für einfache und assemblyqualifizierte Typennamen angezeigt.
Auflösen von Typen
Wenn typeName
kein Assemblyname angegeben wird, typeResolver
wird immer aufgerufen. Wenn typeName
ein Assemblyname angegeben wird, wird nur aufgerufen, typeResolver
wenn der Assemblyname erfolgreich aufgelöst wird. Wenn oder Standardassembly-Probing assemblyResolver
zurückgegeben null
wird, typeResolver
wird nicht aufgerufen.
Die typeResolver
Methode erhält drei Argumente:
Die Assembly, die gesucht werden soll, oder
null
wenntypeName
kein Assemblyname enthalten ist.Der einfache Name des Typs. Bei einem geschachtelten Typ handelt es sich um den äußeren Typ. Bei einem generischen Typ ist dies der einfache Name des generischen Typs.
Ein boolescher Wert, der lautet,
true
wenn der Fall von Typnamen ignoriert werden soll.
Die Implementierung bestimmt die Art und Weise, wie diese Argumente verwendet werden. Die typeResolver
Methode sollte zurückgegeben null
werden, wenn der Typ nicht aufgelöst werden kann. Wenn typeResolver
sie zurückgibt null
und throwOnError
ist true
, wird diese Überladung GetType von Würfen ausgelöst TypeLoadException.
Die Effekte verschiedener Typauflösungsoptionen werden als Tabelle im Abschnitt "Mixed Name Resolution " für einfache und assemblyqualifizierte Typennamen angezeigt.
Auflösen geschachtelter Typen
Wenn typeName
es sich um einen geschachtelten Typ handelt, wird nur der Name des äußeren Enthaltenden Typs an typeResolver
übergeben. Wenn typeResolver
dieser Typ zurückgegeben wird, wird die GetNestedType Methode rekursiv aufgerufen, bis der innerste geschachtelte Typ aufgelöst wurde.
Auflösen generischer Typen
Die GetType wird rekursiv aufgerufen, um generische Typen zu auflösen: Zuerst zum Auflösen des generischen Typs selbst und dann zum Auflösen der Typargumente. Wenn ein Typargument generisch ist, wird rekursiv aufgerufen, GetType um die Typargumente aufzulösen usw.
Die Kombination von assemblyResolver
und typeResolver
deren Bereitstellung muss in der Lage sein, alle Ebenen dieses Rekursions aufzulösen. Angenommen, Sie geben ein assemblyResolver
, das das Laden von MyAssembly
. Angenommen, Sie möchten den generischen Typ Dictionary<string, MyType>
auflösen (Dictionary(Of String, MyType)
in Visual Basic). Möglicherweise übergeben Sie den folgenden generischen Typnamen:
"System.Collections.Generic.Dictionary`2[System.String,[MyNamespace.MyType, MyAssembly]]"
Beachten Sie, dass MyType
es sich um das einzige assemblyqualifizierte Typargument handelt. Die Namen und Dictionary<TKey,TValue> String Klassen sind nicht assemblyqualifizierte. Sie typeResolver
müssen entweder eine Assembly oder null
eine Assembly verarbeiten können, da sie für null
Dictionary<TKey,TValue> und .String Dieser Fall kann verarbeitet werden, indem eine Überladung der Methode aufgerufen wird, die GetType eine Zeichenfolge verwendet, da beide nicht qualifizierten Typnamen in mscorlib.dll/System.Private.CoreLib.dll enthalten sind:
Type t = Type.GetType(test,
(aName) => aName.Name == "MyAssembly" ?
Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") : null,
(assem, name, ignore) => assem == null ?
Type.GetType(name, false, ignore) :
assem.GetType(name, false, ignore)
);
let t =
Type.GetType(test,
(fun aName ->
if aName.Name = "MyAssembly" then
Assembly.LoadFrom @".\MyPath\v5.0\MyAssembly.dll"
else null),
fun assem name ignr ->
if assem = null then
Type.GetType(name, false, ignr)
else
assem.GetType(name, false, ignr))
Die assemblyResolver
Methode wird nicht für den Wörterbuchtyp und den Zeichenfolgentyp aufgerufen, da diese Typnamen nicht assemblyqualifizierte sind.
Nehmen wir nun an, dass anstelle des System.String
ersten generischen Argumenttyps YourType
, aus YourAssembly
:
"System.Collections.Generic.Dictionary`2[[YourNamespace.YourType, YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], [MyNamespace.MyType, MyAssembly]]"
Da diese Assembly weder mscorlib.dll/System.Private.CoreLib.dll noch die derzeit ausgeführte Assembly ist, können Sie ohne assemblyqualifizierten Namen nicht auflösen YourType
. Da Ihr assemblyResolve
Fall rekursiv aufgerufen wird, muss er in der Lage sein, diesen Fall zu behandeln. Anstatt für andere Assemblys als MyAssembly
zurückzugebennull
, führt sie nun eine Assemblylade mithilfe des angegebenen AssemblyName Objekts aus.
Type t2 = Type.GetType(test,
(aName) => aName.Name == "MyAssembly" ?
Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") :
Assembly.Load(aName),
(assem, name, ignore) => assem == null ?
Type.GetType(name, false, ignore) :
assem.GetType(name, false, ignore), true
);
let t2 =
Type.GetType(test,
(fun aName ->
if aName.Name = "MyAssembly" then
Assembly.LoadFrom @".\MyPath\v5.0\MyAssembly.dll"
else Assembly.Load aName),
(fun assem name ignr ->
if assem = null then
Type.GetType(name, false, ignr)
else
assem.GetType(name, false, ignr)), true)
Zurück zu Verwendungsnotizen.
Auflösen von Typnamen mit Sonderzeichen
Bestimmte Zeichen haben besondere Bedeutungen in assemblyqualifizierten Namen. Wenn ein einfacher Typname diese Zeichen enthält, verursachen die Zeichen Analysefehler, wenn der einfache Name Teil eines assemblyqualifizierten Namens ist. Um die Analysefehler zu vermeiden, müssen Sie die Sonderzeichen mit einem umgekehrten Schrägstrich escapen, bevor Sie den assemblyqualifizierten Namen an die GetType Methode übergeben können. Wenn beispielsweise ein Typ benannt Strange]Type
ist, muss das Escapezeichen vor der eckigen Klammer wie folgt hinzugefügt werden: Strange\]Type
Hinweis
Namen mit solchen Sonderzeichen können nicht in Visual Basic oder C# erstellt werden, können jedoch mithilfe von Microsoft-Zwischensprache (MSIL) oder durch Aussendet dynamischer Assemblys erstellt werden.
In der folgenden Tabelle sind die Sonderzeichen für Typnamen aufgeführt.
Zeichen | Bedeutung |
---|---|
, (Komma) |
Trennzeichen für assemblyqualifizierte Namen. |
[] (eckige Klammern) |
Gibt als Suffixpaar einen Arraytyp an; als Trennzeichenpaar schließt generische Argumentlisten und assemblyqualifizierte Namen ein. |
& (kaufmännisches Und-Zeichen) |
Gibt als Suffix an, dass ein Typ ein Bezugstyp ist. |
* (Sternchen) |
Gibt als Suffix an, dass ein Typ ein Zeigertyp ist. |
+ (plus) |
Trennzeichen für geschachtelte Typen. |
\ (umgekehrter Schrägstrich) |
Escapezeichen. |
Eigenschaften, z. B AssemblyQualifiedName . zurückgeben korrekt escapefähige Zeichenfolgen. Sie müssen ordnungsgemäß escapete Zeichenfolgen an die GetType Methode übergeben. Die Methode übergibt wiederum GetType ordnungsgemäß escapefähige Namen an typeResolver
und an die Standardmethoden für die Typauflösung. Wenn Sie einen Namen mit einem unescaped namen in typeResolver
vergleichen müssen, müssen Sie die Escapezeichen entfernen.
Zurück zu Verwendungsnotizen.
Auflösung gemischter Name
In der folgenden Tabelle werden die Interaktionen zwischen assemblyResolver
, typeResolver
und der Standardnamenauflösung für alle Kombinationen des Typnamens und des Assemblynamens in typeName
:
Inhalt des Typnamens | Assembly resolver-Methode | Type Resolver-Methode | Ergebnis |
---|---|---|---|
Typ, Assembly | NULL | NULL | Entspricht dem Aufrufen der Type.GetType(String, Boolean, Boolean) Methodenüberladung. |
Typ, Assembly | bereitgestellt | NULL | assemblyResolver gibt die Assembly zurück oder gibt zurück null , wenn die Assembly nicht aufgelöst werden kann. Wenn die Assembly aufgelöst wird, wird die Assembly.GetType(String, Boolean, Boolean) Methodenüberladung verwendet, um den Typ aus der Assembly zu laden. Andernfalls gibt es keinen Versuch, den Typ zu beheben. |
Typ, Assembly | NULL | bereitgestellt | Entspricht dem Konvertieren des Assemblynamens in ein AssemblyName Objekt und aufrufen der Assembly.Load(AssemblyName) Methodenüberladung zum Abrufen der Assembly. Wenn die Assembly aufgelöst wird, wird sie an typeResolver ; andernfalls typeResolver wird sie nicht aufgerufen, und es wird kein weiterer Versuch unternommen, den Typ zu beheben. |
Typ, Assembly | bereitgestellt | bereitgestellt | assemblyResolver gibt die Assembly zurück oder gibt zurück null , wenn die Assembly nicht aufgelöst werden kann. Wenn die Assembly aufgelöst wird, wird sie an typeResolver ; andernfalls typeResolver wird sie nicht aufgerufen, und es wird kein weiterer Versuch unternommen, den Typ zu beheben. |
Typ | null, bereitgestellt | NULL | Entspricht dem Aufrufen der Type.GetType(String, Boolean, Boolean) Methodenüberladung. Da der Assemblyname nicht angegeben wird, werden nur mscorlib.dll/System.Private.CoreLib.dll und die derzeit ausgeführte Assembly durchsucht. Wenn assemblyResolver angegeben, wird sie ignoriert. |
Typ | null, bereitgestellt | bereitgestellt | typeResolver wird aufgerufen und null wird für die Assembly übergeben. typeResolver kann einen Typ aus jeder Assembly bereitstellen, einschließlich Assemblys, die sie für den Zweck lädt. Wenn assemblyResolver angegeben, wird sie ignoriert. |
Assembly | null, bereitgestellt | null, bereitgestellt | Eine FileLoadException wird ausgelöst, da der Assemblyname analysiert wird, als ob es sich um einen assemblyqualifizierten Typnamen handelt. Dies führt zu einem ungültigen Assemblynamen. |
Zurück zu: Verwendungshinweise, Auflösen von Assemblys, Auflösen von Typen.