attributo
Consente di creare un attributo personalizzato.
[ attribute(
AllowOn,
AllowMultiple=boolean,
Inherited=boolean
) ]
Parametri
AllowOn
Specifica gli elementi del linguaggio in cui è possibile applicare l'attributo personalizzato.l'impostazione predefinita è System:: AttributeTargets:: tutti (vedere System:: AttributeTargets).AllowMultiple
Specifica se è possibile applicare l'attributo personalizzato ripetutamente a un costrutto.l'impostazione predefinita è FALSE.Inherited
Indica se l'attributo deve essere ereditato da sottoclassi.Il compilatore non fornisce supporto speciale a questa funzionalità, è il processo di utenti di attributo (reflection, ad esempio) rispettano queste informazioni.se Inherited viene TRUE, l'attributo viene ereditato.se AllowMultiple viene TRUE, l'attributo è accumulerà sul membro derivato; se AllowMultiple viene FALSE, l'attributo verrà ignorato (o sostituire) nell'erediterietà.se Inherited viene FALSE, l'attributo non verrà ereditato.l'impostazione predefinita è TRUE.
Note
[!NOTA]
attribute l'attributo è ora deprecata.Utilizzare l'attributo System.Attribute di Common Language Runtime a direttamente per creare i attirbutes definiti dall'utente.Per ulteriori informazioni, vedere Attributi definiti dall'utente (Estensioni del componente C++).
Definire una classe attributo personalizzato inserendo attribute attributo a una definizione della struttura o della classe gestita.Il nome della classe è l'attributo personalizzato.Di seguito è riportato un esempio:
[ attribute(Parameter) ]
public ref class MyAttr {};
definisce un attributo denominato MyAttr applicabile ai parametri di funzione.La classe deve essere pubblica se l'attributo verrà mantenuto in altri assembly.
[!NOTA]
Per impedire conflitti dello spazio dei nomi, tutti i nomi di attributo in modo implicito terminano con “attribute„; in questo esempio, il nome dell'attributo e la classe è effettivamente MyAttrAttribute, ma MyAttr e MyAttrAttribute possono essere utilizzati indifferentemente.
I costruttori pubblici della classe definisce i parametri senza nome dell'attributo.I costruttori di overload consentono più modalità di specificare l'attributo, pertanto un attributo personalizzato definito il modo seguente:
// cpp_attr_ref_attribute.cpp
// compile with: /c /clr
using namespace System;
[ attribute(AttributeTargets::Class) ] // apply attribute to classes
public ref class MyAttr {
public:
MyAttr() {} // Constructor with no parameters
MyAttr(int arg1) {} // Constructor with one parameter
};
[MyAttr]
ref class ClassA {}; // Attribute with no parameters
[MyAttr(123)]
ref class ClassB {}; // Attribute with one parameter
I membri dati pubblici e le proprietà della classe sono i parametri denominati facoltativi dell'attributo:
// cpp_attr_ref_attribute_2.cpp
// compile with: /c /clr
using namespace System;
[ attribute(AttributeTargets::Class) ]
ref class MyAttr {
public:
// Property Priority becomes attribute's named parameter Priority
property int Priority {
void set(int value) {}
int get() { return 0;}
}
// Data member Version becomes attribute's named parameter Version
int Version;
MyAttr() {} // constructor with no parameters
MyAttr(int arg1) {} // constructor with one parameter
};
[MyAttr(123, Version=2)]
ref class ClassC {};
Per un elenco di tipi di parametro possibili dell'attributo, vedere attributi personalizzati.
vedere Attributi definiti dall'utente (Estensioni del componente C++) per una descrizione delle destinazioni dell'attributo.
attribute l'attributo presenta AllowMultiple parametro che specifica se l'attributo personalizzato è di utilizzo singolo o multiuse (possibile visualizzata più volte alla stessa entità).
// cpp_attr_ref_attribute_3.cpp
// compile with: /c /clr
using namespace System;
[ attribute(AttributeTargets::Class, AllowMultiple = true) ]
ref struct MyAttr {
MyAttr(){}
}; // MyAttr is a multiuse attribute
[MyAttr, MyAttr()]
ref class ClassA {};
Le classi di attributi personalizzati che derivano direttamente o indirettamente da AttributeCollection, che rappresenta l'id delle definizioni di attributo in rapido e semplice di metadati.attribute l'attributo implica l'ereditarietà da system:: L'attributo, pertanto la derivazione esplicita non è necessario:
[ attribute(Class) ]
ref class MyAttr
equivale a
[ attribute(Class) ]
ref class MyAttr : System::Attribute // OK, but redundant.
attribute è un alias per System.AttributeUsageAttribute (non AttributeAttribute; ciò è un'eccezione all'attributo che indica la regola).
Requisiti
contesto di attributo
Si applica a |
ref classe, struttura di riferimento |
ripetibile |
No |
attributi obbligatori |
Nessuno |
attributi non validi |
Nessuno |
per ulteriori informazioni sui contesti di attributo, vedere Associare ai contesti.
Esempio
// cpp_attr_ref_attribute_4.cpp
// compile with: /c /clr
using namespace System;
[attribute(AttributeTargets::Class)]
ref struct ABC {
ABC(Type ^) {}
};
[ABC(String::typeid)] // typeid operator yields System::Type ^
ref class MyClass {};
Inherited l'argomento predefinito specifica se un attributo personalizzato applicato a una classe base indicherà sulla reflection di una classe derivata.
// cpp_attr_ref_attribute_5.cpp
// compile with: /clr
using namespace System;
using namespace System::Reflection;
[attribute( AttributeTargets::Method, Inherited=false )]
ref class BaseOnlyAttribute { };
[attribute( AttributeTargets::Method, Inherited=true )]
ref class DerivedTooAttribute { };
ref struct IBase {
public:
[BaseOnly, DerivedToo]
virtual void meth() {}
};
// Reflection on Derived::meth will show DerivedTooAttribute
// but not BaseOnlyAttribute.
ref class Derived : public IBase {
public:
virtual void meth() override {}
};
int main() {
IBase ^ pIB = gcnew Derived;
MemberInfo ^ pMI = pIB->GetType( )->GetMethod( "meth" );
array<Object ^> ^ pObjs = pMI->GetCustomAttributes( true );
Console::WriteLine( pObjs->Length ) ;
}