атрибут
Позволяет создать настраиваемый атрибут.
[ attribute(
AllowOn,
AllowMultiple=boolean,
Inherited=boolean
) ]
Параметры
AllowOn
Определяет элементы языка, к которым настраиваемый атрибут можно применить. Значение по умолчанию System:: AttributeTargets:: Все (см. System:: AttributeTargets).AllowMultiple
Определяет, является ли настраиваемый атрибут может быть применен к конструкции повторно. Значение по умолчанию False.Inherited
Указывает ли атрибут быть унаследованным подклассами. Компилятор не предоставляет никаких специальную поддержку этой функциональности; задание объектов-получателей атрибута (отражения, например учитывать эти сведения. If Inherited существует Trueатрибут унаследован. If AllowMultiple существует Trueатрибут накапливает в производном элементе; If AllowMultiple существует Falseатрибут переопределяет (или заменить) в наследовании. If Inherited существует Falseатрибут не является унаследованным. Значение по умолчанию True.
Заметки
Примечание
attribute атрибут теперь нерекомендуем.Используйте атрибут System.Attribute среды CLR в непосредственно для создания определяемых пользователем attirbutes.Дополнительные сведения см. в разделе Пользовательские атрибуты (расширения компонентов C++).
Указании a настраиваемый атрибут устанавливая attribute атрибут управляемом определении класса или структуры. Имя класса настраиваемого атрибута. Примеры.
[ attribute(Parameter) ]
public ref class MyAttr {};
определяет атрибут с именем MyAttr, которое можно применять для функционирования параметры. Класс должен быть открытым, если атрибут планируется использовать в других сборках.
Примечание
Во избежание конфликтов пространств имен, все имена атрибутов явно заканчивается на "атрибутом"; в этом примере имя атрибута и класс, но фактически MyAttrAttribute MyAttr и MyAttrAttribute можно использовать взаимозаменимо.
Открытые конструкторы типа задают параметры атрибута неименованные. Перегруженные конструкторы предоставляют различные способы указания атрибута, чтобы настраиваемый атрибут, который определен следующим образом:
// 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
Элементы данных и открытые свойства типа с именем необязательно атрибута параметрами:
// 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 {};
Список возможных типов параметров атрибутов см. в разделе Пользовательские атрибуты.
См. Пользовательские атрибуты (расширения компонентов C++) обсуждение в целевых объектах атрибута.
attribute атрибут имеющий AllowMultiple параметр, который определяет, является ли настраиваемый атрибут одна использование или multiuse (может появляться более одного раза в одну и ту же сущность).
// 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 {};
Классы настраиваемого атрибута получаются напрямую или косвенно от #ctor, который упрощает определение определения атрибута в метаданных легко и быстро. attribute атрибут указывает наследование из system:: Точный атрибут, поэтому вывод не требуются.
[ attribute(Class) ]
ref class MyAttr
, эквивалентно выражению
[ attribute(Class) ]
ref class MyAttr : System::Attribute // OK, but redundant.
attribute псевдоним AttributeUsageAttribute (не AttributeAttribute; это исключением из правила именования атрибута).
Требования
Контекст атрибута
Применение |
ref класс" структура ref |
Repeatable |
Нет |
Обязательные атрибуты |
None |
Недопустимые атрибуты |
None |
Дополнительные сведения о контекстах атрибута см. в разделе Контексты атрибута.
Пример
// 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 именованные аргументы определяют, будет ли настраиваемый атрибут, примененный в базовом классе вверх на отражении производного класса.
// 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 ) ;
}