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
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#)