Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.
Die folgenden Richtlinien gelten für alle Überladungen:
- Eine Eigenschaft gilt für Reflection als öffentlich, wenn sie mindestens einen Accessor hat, der öffentlich ist. Andernfalls gilt die Eigenschaft als privat, und Sie müssen BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static verwenden (in Visual Basic die Werte mit
Orkombinieren), um sie abzurufen. - Wenn der aktuelle Type einen konstruierten generischen Typ darstellt, gibt diese Methode den PropertyInfo zurück, bei dem die Typparameter durch die entsprechenden Typargumente ersetzt sind.
- Wenn der aktuelle Type Parameter einen Typparameter in der Definition eines generischen Typs oder einer generischen Methode darstellt, durchsucht diese Methode die Eigenschaften der Klasseneinschränkung.
GetProperty(String)-Methode
Bei der Suche nach name wird die Groß- und Kleinschreibung beachtet. Die Suche schließt öffentliche statische und öffentliche Instanz-Eigenschaften ein.
Situationen, in denen AmbiguousMatchException auftritt, schließen Folgendes ein:
- Ein Typ enthält zwei indizierte Eigenschaften, die denselben Namen haben, aber unterschiedliche Zahlen von Parametern. Verwenden Sie zum Auflösen der Mehrdeutigkeit eine Überladung der GetProperty Methode, die Parametertypen angibt.
- Ein abgeleiteter Typ deklariert eine Eigenschaft, die eine geerbte Eigenschaft mit demselben Namen ausblendet, indem der
newModifizierer (Shadowsin Visual Basic) verwendet wird. Um die Mehrdeutigkeit zu beheben, verwenden Sie die GetProperty(String, BindingFlags)-Methodenüberladung und fügen das BindingFlags.DeclaredOnly-Flag hinzu, um die Suche auf Mitglieder zu beschränken, die nicht vererbt werden.
GetProperty(String, BindingFlags)-Methode
Die folgenden BindingFlags Filterkennzeichnungen können verwendet werden, um zu definieren, welche Eigenschaften in die Suche einbezogen werden sollen:
- Sie müssen entweder
BindingFlags.InstanceoderBindingFlags.Staticangeben, um eine Rückgabe zu erhalten. - Geben Sie an
BindingFlags.Public, dass öffentliche Eigenschaften in die Suche eingeschlossen werden sollen. - Geben Sie an
BindingFlags.NonPublic, dass nicht öffentliche Eigenschaften (d. h. private, interne und geschützte Eigenschaften) in die Suche einbezogen werden sollen. - Geben Sie
BindingFlags.FlattenHierarchyan, umpublicundprotectedstatische Member in der gesamten Hierarchie einzuschließen;privatestatische Member in geerbten Klassen sind nicht enthalten.
Die folgenden BindingFlags Modifiziererkennzeichnungen können verwendet werden, um die Funktionsweise der Suche zu ändern:
-
BindingFlags.IgnoreCase, um die Groß- und Kleinschreibung vonnamezu ignorieren. -
BindingFlags.DeclaredOnly, um nur die bei Type deklarierten Eigenschaften zu suchen, nicht die Eigenschaften, die einfach geerbt wurden.
Situationen, in denen AmbiguousMatchException auftritt, schließen Folgendes ein:
- Ein Typ enthält zwei indizierte Eigenschaften, die denselben Namen haben, aber unterschiedliche Zahlen von Parametern. Verwenden Sie zum Auflösen der Mehrdeutigkeit eine Überladung der GetProperty Methode, die Parametertypen angibt.
- Ein abgeleiteter Typ deklariert eine Eigenschaft, die eine geerbte Eigenschaft mit demselben Namen unter Verwendung des
newModifizierers (Shadowsin Visual Basic) ausblendet. Um die Mehrdeutigkeit zu beheben, verwenden Sie BindingFlags.DeclaredOnly, um die Suche auf Mitglieder zu beschränken, die nicht geerbt wurden.
GetProperty(System.String, System.Reflection.BindingFlags, System.Reflection.Binder, System.Type, System.Type[], System.Reflection.ParameterModifier[])-Methode
Obwohl der Standard-Binder ParameterModifier (den modifiers Parameter) nicht verarbeitet, können Sie die abstrakte System.Reflection.Binder Klasse verwenden, um einen benutzerdefinierten Binder zu schreiben, der modifiers verarbeitet.
ParameterModifier wird nur verwendet, wenn der Aufruf über die COM-Interoperabilität erfolgt, und nur Parameter, die als Referenz übergeben werden, werden behandelt.
Die folgende Tabelle zeigt, welche Member einer Basisklasse von den Get Methoden zurückgegeben werden, wenn sie einen Typ widerspiegeln.
| Memberart | Statisch | Nicht statisch |
|---|---|---|
| Konstruktor | Nein | Nein |
| Feld | Nein | Ja. Ein Feld ist immer hide-by-name-and-signature. |
| Ereignis | Nicht anwendbar | Die allgemeine Typsystemregel besteht darin, dass die Vererbung mit der der Methode identisch ist, die die Eigenschaft implementiert. Reflection behandelt Eigenschaften als Hide-by-Name-und-Signatur.2 |
| Methode | Nein | Ja. Eine Methode (sowohl virtuell als auch nicht-virtuell) kann Hide-by-name oder Hide-by-name-and-signature sein. |
| Geschachtelter Typ | Nein | Nein |
| Eigentum | Nicht anwendbar | Die allgemeine Typsystemregel besteht darin, dass die Vererbung mit der der Methode identisch ist, die die Eigenschaft implementiert. Reflection behandelt Eigenschaften als Hide-by-Name-und-Signatur.2 |
Hinweise:
- Hide-by-name-and-signature berücksichtigt alle Elemente der Signatur, einschließlich angepasste Modifikatoren, Rückgabetypen, Parametertypen, Sentinels und nicht verwaltete Aufrufkonventionen. Dies ist ein binärer Vergleich.
- Bei der Reflection sind Eigenschaften und Ereignisse Hide-by-Name-and-Signature. Wenn Sie über eine Eigenschaft mit einem Get- und einem Set-Accessor in der Basisklasse verfügen, die abgeleitete Klasse jedoch nur über einen Get-Accessor verfügt, blendet die abgeleitete Klasseneigenschaft die Basisklasseneigenschaft aus, und Sie können nicht auf den Setter der Basisklasse zugreifen.
- Benutzerdefinierte Attribute sind nicht Teil des allgemeinen Typsystems.
Die folgenden BindingFlags Filterkennzeichnungen können verwendet werden, um zu definieren, welche Eigenschaften in die Suche einbezogen werden sollen:
- Sie müssen entweder
BindingFlags.InstanceoderBindingFlags.Staticangeben, um eine Rückgabe zu erhalten. - Geben Sie an
BindingFlags.Public, dass öffentliche Eigenschaften in die Suche eingeschlossen werden sollen. - Geben Sie an
BindingFlags.NonPublic, dass nicht öffentliche Eigenschaften (d. h. private, interne und geschützte Eigenschaften) in die Suche einbezogen werden sollen. - Geben Sie
BindingFlags.FlattenHierarchyan, umpublicundprotectedstatische Member in der gesamten Hierarchie einzuschließen;privatestatische Member in geerbten Klassen sind nicht enthalten.
Die folgenden BindingFlags Modifiziererkennzeichnungen können verwendet werden, um die Funktionsweise der Suche zu ändern:
-
BindingFlags.IgnoreCase, um die Groß- und Kleinschreibung vonnamezu ignorieren. -
BindingFlags.DeclaredOnly, um nur die bei Type deklarierten Eigenschaften zu suchen, nicht die Eigenschaften, die einfach geerbt wurden.
Indexer und Standardeigenschaften
Visual Basic, C# und C++ haben eine vereinfachte Syntax für den Zugriff auf indizierte Eigenschaften und zulassen, dass eine indizierte Eigenschaft ein Standard für den Typ ist. Zum Beispiel ruft die Syntax myList (ArrayList in Visual Basic), wenn sich die Variable myList[3] auf eine myList(3) bezieht, das Element mit dem Index von 3 ab. Sie können die Eigenschaft überladen.
In C# wird dieses Feature als Indexer bezeichnet und kann nicht anhand des Namens referenziert werden. Standardmäßig wird ein C#-Indexer in Metadaten als indizierte Eigenschaft mit dem Namen Itemangezeigt. Ein Klassenbibliotheksentwickler kann jedoch das IndexerNameAttribute Attribut verwenden, um den Namen des Indexers in den Metadaten zu ändern. Die Klasse String hat z. B. einen Indexer mit dem Namen Chars[]. Indizierte Eigenschaften, die mit anderen Sprachen als C# erstellt wurden, können auch andere Namen haben als Item.
Um zu ermitteln, ob ein Typ über eine Standardeigenschaft verfügt, verwenden Sie die GetCustomAttributes(Type, Boolean) Methode, um das DefaultMemberAttribute Attribut zu testen. Wenn der Typ hat DefaultMemberAttribute, gibt die MemberName Eigenschaft den Namen der Standardeigenschaft zurück.