Udostępnij za pośrednictwem


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

Atrybuty niestandardowe umożliwiają rozszerzenie metadane interfejsu, klasy lub struktury, metody, parametr lub wyliczenie.

Czas wykonania wszystkich

Czas wykonania wszystkich obsługują niestandardowe atrybuty.

Środowisko wykonawcze systemu Windows

C + +/ CX atrybutów obsługuje tylko właściwości, ale nie atrybut konstruktorów lub metody.

yd21828z.collapse_all(pl-pl,VS.110).gifWymagania

Opcja kompilatora:/ZW

Aparat plików wykonywalnych języka wspólnego

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

yd21828z.collapse_all(pl-pl,VS.110).gifUwagi

Informacje i przedstawione w tym temacie składni ma zastępują informacje przedstawione w atrybut.

Można zdefiniować niestandardowy atrybut, zdefiniowanie typu oraz dokonywanie Attribute klasa podstawowa dla typu i opcjonalnie stosowania AttributeUsageAttribute atrybut.

Na przykład w programie Microsoft Transaction Server (MTS) 1.0, zachowanie w odniesieniu do transakcji, synchronizacja, równoważenie obciążenia i określono za pomocą niestandardowych identyfikatorów GUID wstawione do biblioteki typów, za pomocą atrybutu niestandardowego ODL itd.Stąd klient serwera MTS może określić jego właściwości, czytając biblioteki typów.W.NET Framework analog biblioteki typów są metadane i analogowe niestandardowy atrybut ODL jest atrybutów niestandardowych.Również 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 Visual C++, zobacz Silnej nazwy zestawów (podpisanie zestawu) (C + +/ CLI).

yd21828z.collapse_all(pl-pl,VS.110).gifWymagania

Opcja kompilatora:/clr

yd21828z.collapse_all(pl-pl,VS.110).gifPrzykłady

Przykład

Poniżej pokazano 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 pokazuje typowe użycie atrybutów niestandardowych: utworzenie wystąpienia serwera, który pełni opisać się klientom.

// 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 określa niestandardowy atrybut, który pobiera tablicę obiektów ^ jako parametry.

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

Zobacz typeid (C++ Component Extensions) informacji na temat zwraca wartość 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ęść publiczne klasy atrybutu niestandardowego musi być możliwy do serializacji.Podczas tworzenia niestandardowych atrybutów, nazwanych argumentów Twój niestandardowy atrybut są ograniczone do stałych kompilacji.(To raczej sekwencji bitów, dołączane do układu klasy w 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

Składnik rozszerzeń dla platform Runtime