Destinos de atributo (Extensiones de componentes de C++)
Los especificadores de uso de atributos permiten especificar los destinos del atributo.Cada atributo está definido aplicar a determinados elementos del lenguaje.Por ejemplo, un atributo podría definir aplicar a las clases y los structs.La lista siguiente se muestran los elementos sintácticos posibles en los que un atributo personalizado puede utilizarse.Las combinaciones de estos valores (mediante OR lógico) se pueden utilizar.
Para especificar el destino de atributo, para pasar uno o varios enumeradores de AttributeTargets a AttributeUsageAttribute al definir el atributo.
A continuación se muestra una lista de destinos válidos de atributo:
Destino |
Uso del ejemplo |
---|---|
Todos (se aplican a todas las construcciones) |
|
Ensamblado (se aplica a un ensamblado en conjunto) |
|
Módulo (se aplica a un módulo de conjunto) |
|
Clase |
|
Struct |
|
enum |
|
Constructor |
|
Método |
|
Propiedad. |
|
Campo |
|
Evento |
|
Interfaz |
|
Parámetro |
|
Delegado |
|
ReturnValue |
|
Normalmente, un atributo precede directamente el elemento de lenguaje al que se aplica.Sin embargo, en algunos casos, la posición de un atributo no es suficiente para determinar el destino previsto del atributo.Considere este ejemplo:
[Attr] int MyFn(double x)...
Sintácticamente, no hay ninguna manera de saber si el atributo está diseñado para implementar el método o el valor devuelto del método (en este caso, tomará el método).En estos casos, un especificador de uso de atributos se puede utilizar.Por ejemplo, para que el atributo se aplica al valor devuelto, use el especificador de returnvalue , como sigue:
[returnvalue:Attr] int MyFn(double x)... // applies to return value
Requieren los especificadores de uso de atributos en las situaciones siguientes:
Para especificar un ensamblado o un atributo de nivel de módulo.
Para especificar que un atributo se aplica al valor devuelto de un método, no el método:
[method:Attr] int MyFn(double x)... // Attr applies to method [returnvalue:Attr] int MyFn(double x)...// Attr applies to return value [Attr] int MyFn(double x)... // default: method
Para especificar que un atributo se aplica al descriptor de acceso de una propiedad, no la propiedad:
[method:MyAttr(123)] property int Property() [property:MyAttr(123)] property int Property() [MyAttr(123)] property int get_MyPropy() // default: property
Para especificar que un atributo se aplica al descriptor de acceso de un evento, no el evento:
delegate void MyDel(); ref struct X { [field:MyAttr(123)] event MyDel* MyEvent; //field [event:MyAttr(123)] event MyDel* MyEvent; //event [MyAttr(123)] event MyDel* MyEvent; // default: event }
Un especificador de uso del atributo se aplica únicamente al atributo que le sigue inmediatamente; es decir,
[returnvalue:Attr1, Attr2]
es diferente de
[returnvalue:Attr1, returnvalue:Attr2]
Ejemplo
Descripción
Este ejemplo muestra cómo especificar varios destinos.
Código
// attribute_targets.cpp
// compile with: /clr /c
using namespace System;
[AttributeUsage(AttributeTargets::Class | AttributeTargets::Struct, AllowMultiple = true )]
ref struct Attr : public Attribute {
Attr(bool i){}
Attr(){}
};
[Attr]
ref class MyClass {};
[Attr]
[Attr(true)]
value struct MyStruct {};
Vea también
Referencia
Atributos definidos por el usuario (Extensiones de componentes de C++)