Attribute
Attribute bieten eine leistungsstarke Methode zum Zuordnen von Metadaten oder deklarativen Informationen mit Code (Assemblys, Typen, Methoden, Eigenschaften usw.). Nachdem ein Attribut einer Programmentität zugeordnet ist, kann das Attribut zur Laufzeit abgefragt werden, indem eine Technik namens Reflectionverwendet wird.
Attribute weisen die folgenden Eigenschaften auf:
- Attribute fügen Ihrem Programm Metadaten hinzu. Metadaten- sind Informationen zu den in einem Programm definierten Typen. Alle .NET-Assemblys enthalten einen angegebenen Satz von Metadaten, der die Typen und Typmember beschreibt, die in der Assembly definiert sind. Sie können benutzerdefinierte Attribute hinzufügen, um zusätzliche Informationen anzugeben, die erforderlich sind.
- Sie können ein oder mehrere Attribute auf ganze Assemblys, Module oder kleinere Programmelemente wie Klassen und Eigenschaften anwenden.
- Attribute können Argumente auf die gleiche Weise akzeptieren wie Methoden und Eigenschaften.
- Ihr Programm kann seine eigenen Metadaten oder die Metadaten in anderen Programmen mithilfe der Reflexion untersuchen.
Reflection stellt Objekte (vom Typ Type) bereit, die Assemblys, Module und Typen beschreiben. Mithilfe der Spiegelung können Sie eine Instanz eines Typs dynamisch erstellen, den Typ an ein vorhandenes Objekt binden oder den Typ aus einem vorhandenen Objekt abrufen und seine Methoden aufrufen oder auf seine Felder und Eigenschaften zugreifen. Wenn Sie Attribute in Ihrem Code verwenden, können Sie mit Spiegelung darauf zugreifen. Weitere Informationen finden Sie unter Attribute.
Hier ist ein einfaches Beispiel für Spiegelung mithilfe der GetType()-Methode , die von allen Typen der Object
Basisklasse geerbt wird, um den Typ einer Variablen abzurufen:
Anmerkung
Stellen Sie sicher, dass Sie using System;
und using System.Reflection;
oben in Ihrer .cs Datei hinzufügen.
// Using GetType to obtain type information:
int i = 42;
Type type = i.GetType();
Console.WriteLine(type);
Die Ausgabe ist: System.Int32
.
Im folgenden Beispiel wird Reflection verwendet, um den vollständigen Namen der geladenen Assembly abzurufen.
// Using Reflection to get information of an Assembly:
Assembly info = typeof(int).Assembly;
Console.WriteLine(info);
Die Ausgabe sieht in etwa so aus: System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
.
Anmerkung
Die C#-Schlüsselwörter protected
und internal
haben keine Bedeutung in Der Zwischensprache (IL) und werden nicht in den Spiegelungs-APIs verwendet. Die entsprechenden Begriffe in IL sind Family und Assembly. Verwenden Sie die IsAssembly-Eigenschaft, um eine internal
-Methode mithilfe der Spiegelung zu identifizieren. Verwenden Sie IsFamilyOrAssembly zum Identifizieren einer Methode protected internal
.
Verwenden von Attributen
Attribute können in fast jeder Deklaration platziert werden, ein bestimmtes Attribut kann jedoch die Typen von Deklarationen einschränken, für die es gültig ist. In C# geben Sie ein Attribut an, indem Sie den Namen des Attributs in eckige Klammern ([]
) oberhalb der Deklaration der Entität platzieren, auf die sie angewendet wird.
In diesem Beispiel wird das attribut SerializableAttribute verwendet, um ein bestimmtes Merkmal auf eine Klasse anzuwenden:
[Serializable]
public class SampleClass
{
// Objects of this type can be serialized.
}
Eine Methode mit dem Attribut DllImportAttribute wird wie im folgenden Beispiel deklariert:
[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static void SampleMethod();
Mehrere Attribute können in einer Deklaration platziert werden, wie das folgende Beispiel zeigt:
void MethodA([In][Out] ref double x) { }
void MethodB([Out][In] ref double x) { }
void MethodC([In, Out] ref double x) { }
Einige Attribute können für eine bestimmte Entität mehrmals angegeben werden. Ein Beispiel für ein solches Attribut mit mehrfacher Verwendung ist ConditionalAttribute:
[Conditional("DEBUG"), Conditional("TEST1")]
void TraceMethod()
{
// ...
}
Anmerkung
Standardmäßig enden alle Attributnamen mit dem Wort "Attribut", um sie von anderen Elementen in den .NET-Bibliotheken zu unterscheiden. Sie müssen jedoch nicht das Attributsuffix angeben, wenn Sie Attribute im Code verwenden. Beispielsweise entspricht [DllImport]
[DllImportAttribute]
, aber DllImportAttribute
ist der tatsächliche Name des Attributs in der .NET-Klassenbibliothek.
Attributparameter
Viele Attribute weisen Parameter auf, die positional, unbenannt der benannt sein können. Alle Positionsparameter müssen in einer bestimmten Reihenfolge angegeben werden und können nicht weggelassen werden. Benannte Parameter sind optional und können in beliebiger Reihenfolge angegeben werden. Positionsparameter werden zuerst angegeben. Diese drei Attribute sind z. B. gleichwertig:
[DllImport("user32.dll")]
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]
[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]
Der erste Parameter, der DLL-Name, ist positional und kommt immer zuerst; die anderen benannt werden. In diesem Fall werden beide benannten Parameter standardmäßig auf "false" festgelegt, sodass sie weggelassen werden können. Positionsparameter entsprechen den Parametern des Attributkonstruktors. Benannte oder optionale Parameter entsprechen entweder Eigenschaften oder Feldern des Attributs. Informationen zu Standardwerten finden Sie in der Dokumentation des jeweiligen Attributs.
Weitere Informationen zu zulässigen Parametertypen finden Sie im Abschnitt Attribute abschnitt der C#-Sprachspezifikation.
Attributziele
Das Ziel- eines Attributs ist die Entität, auf die das Attribut angewendet wird. Ein Attribut kann beispielsweise auf eine Klasse, eine bestimmte Methode oder eine gesamte Assembly angewendet werden. Standardmäßig gilt ein Attribut für das darauf folgende Element. Sie können aber auch explizit identifizieren, ob ein Attribut auf eine Methode oder auf seinen Parameter oder auf den Rückgabewert angewendet wird.
Verwenden Sie die folgende Syntax, um ein Attributziel explizit zu identifizieren:
[target : attribute-list]
Die Liste der möglichen target
Werte ist in der folgenden Tabelle dargestellt.
Zielwert | Gilt für: |
---|---|
assembly |
Gesamte Assembly |
module |
Aktuelles Assemblymodul |
field |
Feld in einer Klasse oder einer Struktur |
event |
Ereignis |
method |
Methode oder get - und set -Eigenschaftenaccessors |
param |
Methodenparameter oder set -Parameter des Eigenschaftenaccessors |
property |
Eigentum |
return |
Rückgabewert einer Methode, eines Eigenschaftenindexers oder eines get Eigenschaftenaccessors |
type |
Struktur, Klasse, Schnittstelle, Enum oder Delegat |
Sie würden den field
Zielwert angeben, um ein Attribut auf das Backing-Feld anzuwenden, das für eine automatisch implementierte Eigenschaft erstellt wurde.
Das folgende Beispiel zeigt, wie Attribute auf Assemblys und Module angewendet werden. Weitere Informationen finden Sie unter Gemeinsame Attribute (C#).
using System;
using System.Reflection;
[assembly: AssemblyTitleAttribute("Production assembly 4")]
[module: CLSCompliant(true)]
Das folgende Beispiel zeigt, wie Attribute auf Methoden, Methodenparameter und Methodenrückgabewerte in C# angewendet werden.
// default: applies to method
[ValidatedContract]
int Method1() { return 0; }
// applies to method
[method: ValidatedContract]
int Method2() { return 0; }
// applies to parameter
int Method3([ValidatedContract] string contract) { return 0; }
// applies to return value
[return: ValidatedContract]
int Method4() { return 0; }
Anmerkung
Unabhängig von den Zielen, für die ValidatedContract
gültig ist, muss das return
Ziel angegeben werden, auch wenn ValidatedContract
nur für Rückgabewerte definiert wurden. Der Compiler verwendet die AttributeUsage
-Informationen nicht, um mehrdeutige Attributziele aufzulösen. Weitere Informationen finden Sie unter AttributeUsage.
Allgemeine Verwendung für Attribute
Die folgende Liste enthält einige der allgemeinen Verwendungen von Attributen im Code:
- Kennzeichnen von Methoden mithilfe des attributs
WebMethod
in Webdiensten, um anzugeben, dass die Methode über das SOAP-Protokoll aufgerufen werden kann. Weitere Informationen finden Sie unter WebMethodAttribute. - Beschreiben, wie Methodenparameter bei der Interaktion mit systemeigenem Code gemarshallt werden sollen. Weitere Informationen finden Sie unter MarshalAsAttribute.
- Beschreiben der COM-Eigenschaften für Klassen, Methoden und Schnittstellen.
- Aufrufen von nicht verwalteten Code mithilfe der DllImportAttribute Klasse.
- Beschreiben der Assembly im Hinblick auf Titel, Version, Beschreibung oder Marke.
- Beschreiben, welche Member einer Klasse zur Verbesserung der Dauerhaftigkeit serialisiert werden müssen.
- Beschreibung der Zuordnung zwischen Klassenmitgliedern und XML-Knoten für die XML-Serialisierung.
- Beschreiben der Sicherheitsanforderungen für Methoden.
- Angeben von Merkmalen, die zum Erzwingen der Sicherheit verwendet werden.
- Steuern von Optimierungen durch den Just-in-Time-Compiler (JIT), sodass der Code einfach zu debuggen bleibt.
- Abrufen von Informationen zum Aufrufer einer Methode.
Übersicht über Reflektion
Spiegelung ist in den folgenden Situationen nützlich:
- Wenn Sie auf Attribute in den Metadaten Ihres Programms zugreifen müssen. Weitere Informationen finden Sie unter Abrufen von Informationen, die in Attributengespeichert sind.
- Zum Untersuchen und Instanziieren von Typen in einer Assembly
- Zum Erstellen neuer Typen zur Laufzeit Verwenden Sie Klassen in System.Reflection.Emit.
- Zum Ausführen von spätem Binden mit Zugriff auf Methoden der zur Laufzeit erstellten Typen Lesen Sie den Artikel Dynamisches Laden und Verwenden von Typen.
Verwandte Abschnitte
Weitere Informationen: