Atrybuty zdefiniowane przez użytkownika (C++ Component Extensions)

Atrybuty niestandardowe umożliwiają rozszerzenie metadane interfejsu, klasy lub struktury, metoda, parametru lub wyliczenia.

Wszystkie środowiska wykonawcze

Wszystkie programy obsługi obsługuje atrybutów niestandardowych.

Środowisko wykonawcze systemu Windows

C + +/ CX atrybuty obsługują tylko właściwości, ale nie atrybut konstruktorów lub metod.

Wymagania

Opcja kompilatora: /ZW

Środowisko uruchomieniowe języka wspólnego

Atrybuty niestandardowe umożliwiają rozszerzenie metadanych zarządzany element.Aby uzyskać więcej informacji, zobacz Rozszerzanie metadanych za pomocą atrybutów.

Uwagi

Informacje i przedstawione w tym temacie składni ma na celu zastąpienia informacje przedstawione w — atrybut.

Zdefiniowanie typu i dokonując można zdefiniować niestandardowy atrybut Attribute klasą bazową dla typu i opcjonalnie stosowanie AttributeUsageAttribute atrybut.

Na przykład in Microsoft Transaction Server (MTS) 1.0, zachowanie w odniesieniu do transakcji, synchronizacja, równoważenie obciążenia, i tak dalej został określony za pomocą niestandardowych identyfikatorów GUID wstawione do biblioteki typów, używając atrybutu niestandardowego ODL.W związku z tym klient serwera MTS może określić jego właściwości czytając biblioteki typów.W.NET Framework analogowe biblioteki typów są metadane i analogowe niestandardowy atrybut ODL jest atrybutów niestandardowych.Ponadto czytanie biblioteki typów jest analogiczne do typów przy użyciu odbicia.

Aby uzyskać więcej informacji zobacz temat,

Aby uzyskać informacje dotyczące podpisywania zestawów w programie Visual C++, zobacz Zestawy o silnych nazwach (podpisywanie zestawów) (C++/CLI).

Wymagania

Opcja kompilatora: /clr

Przykłady

Przykład

Poniższy przykład pokazuje sposób definiowania atrybutu niestandardowego.

// 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 {};

Przykład

Poniższy przykład ilustruje niektóre ważne funkcje niestandardowe atrybuty.Na przykład, w tym przykładzie przedstawiono wspólnego użytkowania atrybuty niestandardowe: utworzenie wystąpienia serwera, na którym pełni można opisywać sam do klientów.

// 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);
   }
}

Dane wyjściowe

  
  
  
  
  
  

Przykład

Obiekt ^ typ zastąpi typ danych variant.W poniższym przykładzie zdefiniowano niestandardowy atrybut, który pobiera tablicę obiektów ^ jako parametry.

Atrybut argumenty muszą być stałymi znanymi w czasie kompilacji; w większości przypadków powinny one być stała literały.

Zobacz typeid (C++ Component Extensions) informacji na temat sposobu zwracania wartości System::Type z bloku atrybutu niestandardowego.

// 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 {};

Przykład

Środowisko czasu wykonania wymaga, że część publiczna niestandardowa klasa atrybutów musi być możliwy do serializacji. Podczas tworzenia niestandardowych atrybutów, nazwanych argumentów niestandardowy atrybut są ograniczone do wartości stałych podczas kompilacji. (Go traktować jako sekwencję bitów, dołączane do układu klasy metadanych.)

// 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 {};

Zobacz też

Koncepcje

Component Extensions dla platform środowiska uruchomieniowego