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

C#-Programmierhandbuch

Referenz

Reflektion (C#-Programmierhandbuch)

Attribute (C#-Programmierhandbuch)

Verwenden von Attributen (C#-Programmierhandbuch)

Erstellen benutzerdefinierter Attribute (C#-Programmierhandbuch)

Zugriff auf Attribute mit Reflektion (C#-Programmierhandbuch)

System.Reflection

Attribute