Freigeben über


Attribute

Attribute bieten eine leistungsstarke Möglichkeit zum Zuordnen von Metadaten oder deklarativen Informationen zu Code (Assemblys, Typen, Methoden, Eigenschaften usw.). Nachdem Sie ein Attribut einer Programmentität zugeordnet haben, können Sie das Attribut zur Laufzeit mithilfe einer Technik abfragen, die als Spiegelung bezeichnet 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 alle anderen erforderlichen Informationen anzugeben.
  • Attribute können auf ganze Assemblys, Module oder kleinere Programmelemente wie Klassen und Eigenschaften angewendet werden.
  • Attribute können Argumente auf die gleiche Weise akzeptieren wie Methoden und Eigenschaften.
  • Mithilfe von Attributen kann ein Programm eigene Metadaten oder Metadaten in anderen Programmen mithilfe von Spiegelung untersuchen.

Arbeiten mit Reflexion

Reflexions-APIs, die von Type bereitgestellt werden, beschreiben die Assemblys, Module und Typen. 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 mit der GetType() Methode. Alle Typen der Object Basisklasse erben diese Methode, die zum Abrufen des Typs einer Variablen verwendet wird:

Anmerkung

Stellen Sie sicher, dass Sie die using System; und using System.Reflection; Anweisungen oben in Ihrer C#-Codedatei hinzufügen (.cs).

// Using GetType to obtain type information:
int i = 42;
Type type = i.GetType();
Console.WriteLine(type);

Die Ausgabe zeigt den Typ an:

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 ist ähnlich dem folgenden Beispiel:

System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e

Schlüsselwortunterschiede für IL

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. Hier einige Möglichkeiten, wie Sie diese Begriffe verwenden können:

  • Verwenden Sie die internal Eigenschaft, um eine IsAssembly Methode mithilfe von Spiegelung zu identifizieren.
  • Verwenden Sie protected internal zum Identifizieren einer Methode IsFamilyOrAssembly.

Arbeiten mit 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 verwenden Sie das SerializableAttribute Attribut, um ein bestimmtes Merkmal auf eine Klasse anzuwenden:

[Serializable]
public class SampleClass
{
    // Objects of this type can be serialized.
}

Sie können eine Methode mit dem DllImportAttribute Attribut deklarieren:

[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static void SampleMethod();

Sie können mehrere Attribute in einer Deklaration platzieren:

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. Das folgende Beispiel zeigt eine mehrfache Verwendung des ConditionalAttribute Attributs:

[Conditional("DEBUG"), Conditional("TEST1")]
void TraceMethod()
{
    // ...
}

Anmerkung

Standardmäßig enden alle Attributnamen mit dem Suffix "Attribut", um sie von anderen Typen in .NET-Bibliotheken zu unterscheiden. Sie müssen das Attributsuffix jedoch nicht angeben, wenn Sie Attribute im Code verwenden. Beispielsweise entspricht eine [DllImport] Deklaration einer [DllImportAttribute] Deklaration, ist aber DllImportAttribute der tatsächliche Name der Klasse in der .NET-Klassenbibliothek.

Attributparameter

Viele Attribute haben Parameter, die positional, unbenannt oder benannt sein können. In der folgenden Tabelle wird beschrieben, wie Sie mit benannten und positionsbezogenen Attributen arbeiten:

Positionsparameter

Parameter des Attributkonstruktors:

Benannte Parameter

Eigenschaften oder Felder des Attributs:

  • Muss angegeben werden, kann nicht weggelassen werden
  • Immer zuerst spezifizieren
  • In bestimmter Reihenfolge angeben
  • Immer optional, wenn "false" weggelassen wird
  • Nach Positionsparametern angeben
  • In beliebiger Reihenfolge angeben

Der folgende Code zeigt beispielsweise drei gleichwertige DllImport Attribute:

[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 Instanzen sind benannte Parameter. In diesem Szenario werden beide benannten Parameter standardmäßig auf "false" festgelegt, sodass sie weggelassen werden können. 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 Methode oder eine Assembly angewendet werden. Standardmäßig gilt ein Attribut für das darauf folgende Element. Sie können aber auch explizit das element identifizieren, das zugeordnet werden soll, z. B. eine Methode, einen Parameter oder den Rückgabewert.

Verwenden Sie die folgende Syntax, um ein Attributziel explizit zu identifizieren:

[target : attribute-list]

Die folgende Tabelle zeigt die Liste der möglichen target Werte.

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 können den field Zielwert angeben, um ein Attribut auf das Sicherungsfeld 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 "Allgemeine 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 das ValidatedContract Attribut gültig ist, muss das return Ziel angegeben werden, auch wenn das ValidatedContract Attribut so definiert ist, dass es nur auf Rückgabewerte angewendet wird. Mit anderen Worten: Der Compiler verwendet die AttributeUsage Informationen nicht, um mehrdeutige Attributziele aufzulösen. Weitere Informationen finden Sie unter AttributeUsage.

Überprüfen Sie Möglichkeiten zur Verwendung von Attributen

Im Folgenden finden Sie einige gängige Methoden zum Verwenden von Attributen im Code:

  • Markieren Sie Controllermethoden, die mithilfe des HttpPost Attributs auf POST-Nachrichten reagieren. Weitere Informationen finden Sie in der HttpPostAttribute Klasse.
  • Beschreibung, wie Methodenparameter bei der Interaktion mit systemeigenem Code gemarshallt werden sollen. Weitere Informationen finden Sie in der MarshalAsAttribute Klasse.
  • Beschreiben von COM-Eigenschaften (Component Object Model) für Klassen, Methoden und Schnittstellen.
  • Rufen Sie nicht verwalteten Code mithilfe der DllImportAttribute Klasse auf.
  • 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 Klassenmembern und XML-Knoten für die XML-Serialisierung.
  • Beschreiben sie die Sicherheitsanforderungen für Methoden.
  • Geben Sie Merkmale an, die zum Erzwingen der Sicherheit verwendet werden.
  • Steuern Sie Optimierungen mit dem Just-in-Time-Compiler (JIT), sodass der Code einfach zu debuggen bleibt.
  • Abrufen von Informationen zum Aufrufer einer Methode.

Überprüfen von Reflexionsszenarien

Spiegelung ist in den folgenden Szenarien nützlich: