— atrybut
Umożliwia tworzenie atrybutu niestandardowego.
[ attribute(
AllowOn,
AllowMultiple=boolean,
Inherited=boolean
) ]
Parametry
AllowOn
Określa elementy języka, do których można zastosować atrybutu niestandardowego.Wartością domyślną jest System::AttributeTargets::All (zobacz System::AttributeTargets).AllowMultiple
Określa, czy atrybut niestandardowy można wielokrotnie stosować do konstrukcji.Wartością domyślną jest FALSE.Inherited
Wskazuje, czy atrybut ma być dziedziczone przez podklasy.Kompilator nie zapewnia specjalne obsługi tej funkcji; przestrzeganie tych informacji jest zadanie konsumentów atrybut (na przykład odbicia).Jeśli Inherited jest TRUE, atrybut jest dziedziczona.Jeśli AllowMultiple jest TRUE, atrybut gromadzone na komputerze członkowskim pochodnych; Jeśli AllowMultiple jest FALSE, atrybut będzie zastąpić (lub zastąpić) w dziedziczenia.Jeśli Inherited jest FALSE, atrybut nie będą dziedziczone.Wartością domyślną jest TRUE.
Uwagi
[!UWAGA]
attribute Atrybut jest teraz przestarzałe.Wspólne runtime atrybut language System.Attribute bezpośrednio umożliwia tworzenie attirbutes zdefiniowane przez użytkownika.Aby uzyskać więcej informacji, zobacz Atrybuty zdefiniowane przez użytkownika (C++ Component Extensions).
Można zdefiniować Niestandardowy atrybut przez umieszczenie attribute atrybut zarządzanych definicji klasy lub struktury.Nazwa klasy jest atrybutu niestandardowego.Na przykład:
[ attribute(Parameter) ]
public ref class MyAttr {};
Określa atrybut o nazwie MyAttr, które mogą być stosowane do parametrów funkcji.Tej klasy muszą być publiczne, jeśli atrybut ma być używane w innych zestawów.
[!UWAGA]
Aby uniknąć kolizji nazw, wszystkie nazwy atrybutu niejawnie kończyć "Atrybutu"; w tym przykładzie nazwa atrybutu i klasy jest rzeczywiście MyAttrAttribute, ale MyAttr i MyAttrAttribute mogą być używane zamiennie.
Publiczne konstruktory tej klasy zdefiniuj parametry nienazwane tego atrybutu.Konstruktory przeciążony Zezwalaj na wiele sposobów określania atrybutów, więc niestandardowy atrybut, który jest zdefiniowany w następujący sposób:
// 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
Dane publicznych członków i właściwości tej klasy są opcjonalne parametry nazwane atrybutu:
// 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 {};
Listę możliwych atrybut typy parametrów, zobacz Atrybuty niestandardowe.
Zobacz Atrybuty zdefiniowane przez użytkownika (C++ Component Extensions) do dyskusji na cele atrybutu.
attribute Ma atrybut AllowMultiple parametr, który określa, czy atrybut niestandardowy jest jednorazowego użytku lub multiuse (może występować więcej niż raz w tej samej jednostki).
// 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 {};
Niestandardowy atrybut klasy pochodzą bezpośrednio lub pośrednio z #ctor, który ułatwia identyfikowanie definicji atrybutu w metadanych szybki i łatwy.attribute Atrybutu oznacza dziedziczenia z System::Attribute, więc nie jest konieczne jawne wyprowadzenie:
[ attribute(Class) ]
ref class MyAttr
jest odpowiednikiem
[ attribute(Class) ]
ref class MyAttr : System::Attribute // OK, but redundant.
attributejest aliasem dla AttributeUsageAttribute (nie AttributeAttribute; jest to wyjątek od zasady nazewnictwa atrybut).
Wymagania
Atrybutu kontekstu
Stosuje się do |
ref Klasa, ref struct |
Powtarzalne |
Nr |
Wymagane atrybuty |
Brak |
Nieprawidłowe atrybuty |
Brak |
Aby uzyskać więcej informacji na temat kontekstów atrybutu, zobacz Kontekstów atrybutu.
Przykład
// 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 Nazwany argument określa, czy atrybut niestandardowy stosowane w klasie podstawowej pojawią się odbicia w klasie pochodnej.
// 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 ) ;
}