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