Risolvere le ambiguità sulle destinazioni degli attributi (Guida per programmatori C#)

Aggiornamento: novembre 2007

In alcune situazioni, la destinazione di un attributo, ovvero l'entità cui l'attributo viene applicato, risulta ambigua. Nella seguente dichiarazione di metodo, ad esempio, l'attributo SomeAttr potrebbe essere relativo al metodo oppure al valore restituito dal metodo:

public class SomeAttr : System.Attribute { }

[SomeAttr]
int Method()
{
    return 0;
}

Questo tipo di situazione si verifica spesso quando si effettua il marshalling. Per risolvere questa ambiguità, C# è dotato di una serie di destinazioni predefinite per ciascun tipo di dichiarazione, che è possibile ignorare specificando in modo esplicito una destinazione di attributo differente.

// 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; } 

Si noti che questo non dipende dalle destinazioni valide definite per SomeAttr. Anche se SomeAttr fosse definito in modo da poter interessare solo i valori restituiti, sarebbe comunque necessario specificare la destinazione return. In altre parole, il compilatore non utilizza le informazioni di AttributeUsage per risolvere le destinazioni di attributo ambigue. Per ulteriori informazioni, vedere la classe AttributeUsage (Guida per programmatori C#).

La sintassi delle destinazioni degli attributi è la seguente:

[target : attribute-list]

Parametri

  • target
    è una delle seguenti voci: assembly, field, event, method, module, param, property, return, type.

  • attribute-list
    è l'elenco degli attributi applicabili.

Nella tabella che segue sono elencate tutte le dichiarazioni in cui sono consentiti gli attributi. Per ciascuna dichiarazione sono elencate, nella seconda colonna, le possibili destinazioni degli attributi. Le destinazioni in grassetto sono quelle predefinite.

Dichiarazione

Destinazioni possibili

assembly

assembly

module

module

class

type

struct

type

interface

type

enum

type

delegate

type, return

method

method, return

parameter

param

Field

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

Gli attributi a livello di assembly e di modulo non dispongono di alcuna destinazione predefinita. Per ulteriori informazioni, vedere Attributi globali.

Esempio

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();
}

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Reflection (Guida per programmatori C#)

Attributi (Guida per programmatori C#)

Utilizzo di attributi (Guida per programmatori C#)

Creazione di attributi personalizzati (Guida per programmatori C#)

Accesso agli attributi mediante reflection (Guida per programmatori C#)

System.Reflection

Attribute