Поделиться через


Пользовательские атрибуты (расширения компонентов C++)

Настраиваемые атрибуты позволяют расширять метаданные интерфейса, класса или структуры, метода, параметра или перечисления.

Все среды выполнения

Все среды выполнения поддерживают настраиваемые атрибуты.

среда выполнения Windows

Атрибуты C++/CX поддерживают только свойства, но не приписывают конструкторы и методы.

yd21828z.collapse_all(ru-ru,VS.110).gifТребования

Параметр компилятора: /ZW

Среда CLR

Настраиваемые атрибуты позволяют расширять метаданные управляемого элемента.Дополнительные сведения см. в разделе Расширение метаданных с помощью атрибутов.

yd21828z.collapse_all(ru-ru,VS.110).gifЗаметки

Предполагается, что заменяют сведения и синтаксис, представленные в этом разделе сведения, представленное в атрибут.

Можно определить настраиваемый атрибут, указав тип и внесение Attribute базовый класс для типа и при необходимости применить атрибут AttributeUsageAttribute.

Например, на сервере транзакций Microsoft (системе передачи сообщений) 1.0, расширения функциональности по отношению к транзакциям, синхронизация, балансировку нагрузки и т д была определена с помощью пользовательских GUID, вставленные в библиотеку типов с помощью настраиваемого атрибута ODL.Следовательно, клиент сервера mts удалось определить его характеристики, считывая библиотеку типов.В платформе .NET Framework аналоговый библиотеки типов метаданные и аналоговый настраиваемого атрибута ODL настраиваемые атрибуты.Кроме того, считывая библиотеку типов аналогичн использования отражения типов.

Дополнительные сведения см. в следующих разделах:

Дополнительные сведения о подписи сборок в Visual C++ см. в разделе Сборки со строгими именами (подписывание сборок) (C++/CLI).

yd21828z.collapse_all(ru-ru,VS.110).gifТребования

Параметр компилятора: /clr

yd21828z.collapse_all(ru-ru,VS.110).gifПримеры

Пример

В следующем образце показано, как задать настраиваемый атрибут.

// user_defined_attributes.cpp
// compile with: /clr /c
using namespace System;

[AttributeUsage(AttributeTargets::All)]
ref struct Attr : public Attribute {
   Attr(bool i){}
   Attr(){}
};

[Attr]
ref class MyClass {};

Пример

В следующем примере показаны некоторые важные функции, настраиваемые атрибуты.Например, этот пример показывает общее потребление настраиваемых атрибутов: при создании сервер, который может полностью описать клиентам.

// extending_metadata_b.cpp
// compile with: /clr
using namespace System;
using namespace System::Reflection;

public enum class Access { Read, Write, Execute };

// Defining the Job attribute:
[AttributeUsage(AttributeTargets::Class, AllowMultiple=true )]
public ref class Job : Attribute {
public:
   property int Priority {
      void set( int value ) { m_Priority = value; }
      int get() { return m_Priority; }
   }

   // You can overload constructors to specify Job attribute in different ways
   Job() { m_Access = Access::Read; }
   Job( Access a ) { m_Access = a; }
   Access m_Access;

protected:
   int m_Priority;
};

interface struct IService {
   void Run();
};

   // Using the Job attribute:
   // Here we specify that QueryService is to be read only with a priority of 2.
   // To prevent namespace collisions, all custom attributes implicitly 
   // end with "Attribute". 

[Job( Access::Read, Priority=2 )]
ref struct QueryService : public IService {
   virtual void Run() {}
};

// Because we said AllowMultiple=true, we can add multiple attributes 
[Job(Access::Read, Priority=1)]
[Job(Access::Write, Priority=3)]
ref struct StatsGenerator : public IService {
   virtual void Run( ) {}
};

int main() {
   IService ^ pIS;
   QueryService ^ pQS = gcnew QueryService;
   StatsGenerator ^ pSG = gcnew StatsGenerator;

   //  use QueryService
   pIS = safe_cast<IService ^>( pQS );

   // use StatsGenerator
   pIS = safe_cast<IService ^>( pSG );

   // Reflection
   MemberInfo ^ pMI = pIS->GetType();
   array <Object ^ > ^ pObjs = pMI->GetCustomAttributes(false);
   
   // We can now quickly and easily view custom attributes for an 
   // Object through Reflection */
   for( int i = 0; i < pObjs->Length; i++ ) {
      Console::Write("Service Priority = ");
      Console::WriteLine(static_cast<Job^>(pObjs[i])->Priority);
      Console::Write("Service Access = ");
      Console::WriteLine(static_cast<Job^>(pObjs[i])->m_Access);
   }
}

Output

  
  
  
  
  
  

Пример

Тип Object^ заменяет другой тип данных.В следующем примере определяется настраиваемый атрибут, который принимает массив Object^ в качестве параметров.

Аргументы атрибута должны быть константами время компиляции; в большинстве случаев они должны быть постоянными литералами.

См. раздел typeid (расширения компонентов C++) сведения о том, как возвратить значение System::Type из блока настраиваемого атрибута.

// extending_metadata_e.cpp
// compile with: /clr /c
using namespace System;
[AttributeUsage(AttributeTargets::Class | AttributeTargets::Method)]
public ref class AnotherAttr : public Attribute {
public:
   AnotherAttr(array<Object^>^) {}
   array<Object^>^ var1;
};

// applying the attribute
[ AnotherAttr( gcnew array<Object ^> { 3.14159, "pi" }, var1 = gcnew array<Object ^> { "a", "b" } ) ]
public ref class SomeClass {};

Пример

Среда выполнения требуется общая часть класса настраиваемого атрибута должен быть сериализуемым.Разработка настраиваемых атрибутов, именованные аргументы пользовательского атрибута ограничены константам времени компиляции.(Подумайте его в виде последовательности битов, добавленных к структуре класса в метаданных).

// extending_metadata_f.cpp
// compile with: /clr /c
using namespace System;
ref struct abc {};

[AttributeUsage( AttributeTargets::All )]
ref struct A : Attribute {
   A( Type^ ) {}
   A( String ^ ) {}
   A( int ) {}
};

[A( abc::typeid )]
ref struct B {};

См. также

Основные понятия

Расширения компонентов для платформ среды выполнения