Compartir a través de


Eliminar la ambigüedad de los destinos de atributos (Guía de programación de C#)

Actualización: noviembre 2007

En determinadas situaciones, el destino de un atributo, es decir, la entidad a la que se aplica, resulta ambiguo. Por ejemplo, en la siguiente declaración de método, el atributo SomeAttr se podría aplicar al método o al valor devuelto por el método:

public class SomeAttr : System.Attribute { }

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

Este tipo de situación se presenta frecuentemente al realizar el cálculo de referencias. Para resolver la ambigüedad, C# dispone de un conjunto de destinos predeterminados para cada tipo de declaración, que se pueden reemplazar especificando explícitamente otros destinos de atributos.

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

Observe que esto es independiente de los destinos en los cuales SomeAttr se define como válido; es decir, incluso si SomeAttr se definió para aplicarse sólo a valores devueltos, el destino return (valor devuelto) debería especificarse de todas formas. Dicho de otra forma, el compilador no utilizará información de AttributeUsage para resolver destinos de atributo ambiguos. Para obtener más información, vea AttributeUsage (Guía de programación de C#).

La sintaxis para destinos de atributo es la siguiente:

[target : attribute-list]

Parámetros

  • target
    Uno de los siguientes tipos: assembly, field, event, method, module, param, property, return o type.

  • attribute-list
    Lista de atributos aplicables.

En la tabla siguiente se muestran todas las declaraciones en las que se permiten atributos; para cada declaración, los posibles destinos de atributos se muestran en la segunda columna. Los destinos en negrita son los predeterminados.

Declaración

Destinos posibles

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

Los atributos de nivel de módulo y ensamblado no disponen de destino predeterminado. Para obtener más información, vea Atributos globales.

Ejemplo

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

Vea también

Conceptos

Guía de programación de C#

Referencia

Reflexión (Guía de programación de C#)

Atributos (Guía de programación de C#)

Utilizar atributos (Guía de programación de C#)

Crear atributos personalizados (Guía de programación de C#)

Acceso a atributos mediante reflexión (Guía de programación de C#)

System.Reflection

Attribute