Auflösen der Mehrdeutigkeit von Attributzielen (C#-Programmierhandbuch)
Aktualisiert: November 2007
In bestimmten Situationen kann das Ziel eines Attributs, d. h. die Entität, auf die das Attribut angewendet wird, mehrdeutig sein. In der folgenden Methodendeklaration könnte sich das SomeAttr-Attribut beispielsweise auf die Methode oder auf deren Rückgabewert beziehen:
public class SomeAttr : System.Attribute { }
[SomeAttr]
int Method()
{
return 0;
}
Diese Situation tritt häufig beim Marshalling auf. Um eine solche Mehrdeutigkeit zu vermeiden, bietet C# für jede Deklarationsart eine Reihe von Standardzielen, die durch die explizite Angabe des Attributzieles überschrieben werden können.
// default: applies to method
[SomeAttr]
int Method1() { return 0; }
// applies to method
[method: SomeAttr]
int Method2() { return 0; }
// applies to return value
[return: SomeAttr]
int Method3() { return 0; }
Beachten Sie, dass dieser Vorgang unabhängig von den Zielen ist, für die SomeAttr als gültig definiert wurde. Dies bedeutet, dass das return-Ziel selbst dann angegeben werden müsste, wenn SomeAttr laut Definition lediglich auf Rückgabewerte anwendbar wäre. Dies bedeutet auch, dass der Compiler keine AttributeUsage-Informationen verwendet, um mehrdeutige Attributziele aufzulösen. Weitere Informationen hierzu finden Sie unter AttributeUsage (C#-Programmierhandbuch).
Die Syntax für Attributziele lautet wie folgt:
[target : attribute-list]
Parameter
target
eines der folgenden Ziele: assembly, field, event, method, module, param, property, return, type.attribute-list
Eine Liste der anwendbaren Attribute.
In der folgenden Tabelle sind alle Deklarationen aufgelistet, in denen Attribute zulässig sind. In der zweiten Spalte sind die möglichen Ziele für die in der Deklaration enthaltenen Attribute, nach Deklarationen sortiert, aufgeführt. Standardziele sind fett formatiert.
Deklaration |
Mögliche Ziele |
---|---|
assembly |
assembly |
module |
module |
class |
type |
struct |
type |
interface |
type |
enum |
type |
delegate |
type, return |
method |
method, return |
parameter |
param |
Feld |
field |
property – indexer |
property |
property – get accessor |
method, return |
property – set accessor |
method, param, return |
event – field |
event, field, method |
event – property |
event, property |
event – add |
method, param |
event – remove |
method, param |
Attribute auf Assembly- und Modulebene besitzen keine Standardziele. Weitere Informationen finden Sie unter Globale Attribute.
Beispiel
using System.Runtime.InteropServices;
[Guid("12345678-1234-1234-1234-123456789abc"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface ISampleInterface
{
[DispId(17)] // set the DISPID of the method
[return: MarshalAs(UnmanagedType.Interface)] // set the marshaling on the return type
object DoWork();
}
Siehe auch
Konzepte
Referenz
Reflektion (C#-Programmierhandbuch)
Attribute (C#-Programmierhandbuch)
Verwenden von Attributen (C#-Programmierhandbuch)
Erstellen benutzerdefinierter Attribute (C#-Programmierhandbuch)
Zugriff auf Attribute mit Reflektion (C#-Programmierhandbuch)