Bagikan melalui


Atribut yang Ditentukan Pengguna (C++/CLI dan C++/CX)

C++/CLI dan C++/CX memungkinkan Anda membuat atribut khusus platform yang memperluas metadata antarmuka, kelas atau struktur, metode, parameter, atau enumerasi. Atribut ini berbeda dari atribut C++ standar.

Windows Runtime

Anda dapat menerapkan atribut C++/CX ke properti, tetapi tidak untuk konstruktor atau metode.

Persyaratan

Opsi pengkompilasi: /ZW

Runtime Bahasa Umum

Informasi dan sintaks yang disajikan dalam topik ini dimaksudkan untuk menggantikan informasi yang disajikan dalam atribut.

Anda dapat menentukan atribut kustom dengan menentukan jenis dan membuat Attribute kelas dasar untuk jenis dan secara opsional menerapkan AttributeUsageAttribute atribut.

Untuk informasi selengkapnya, lihat:

Untuk informasi tentang rakitan penandatanganan di Visual C++, lihat Rakitan Nama Kuat (Penandatanganan Rakitan) (C++/CLI).

Persyaratan

Opsi pengkompilasi: /clr

Contoh

Contoh berikut menunjukkan cara menentukan atribut kustom.

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

Contoh berikut mengilustrasikan beberapa fitur penting atribut kustom. Misalnya, contoh ini menunjukkan penggunaan umum atribut kustom: membuat instans server yang dapat sepenuhnya menggambarkan dirinya sendiri kepada klien.

// 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);
   }
}
Service Priority = 0

Service Access = Write

Service Priority = 3

Service Access = Write

Service Priority = 1

Service Access = Read

Jenis menggantikan Object^ jenis data varian. Contoh berikut mendefinisikan atribut kustom yang mengambil array Object^ sebagai parameter.

Argumen atribut harus berupa konstanta waktu kompilasi; dalam kebanyakan kasus, mereka harus menjadi literal konstan.

Lihat typeid untuk informasi tentang cara mengembalikan nilai Sistem::Ketik dari blok atribut kustom.

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

Runtime mengharuskan bagian publik dari kelas atribut kustom harus dapat diserialisasikan. Saat menulis atribut kustom, argumen bernama atribut kustom Anda terbatas pada konstanta waktu kompilasi. (Anggap saja sebagai urutan bit yang ditambahkan ke tata letak kelas Anda dalam metadata.)

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

Lihat juga

Ekstensi Komponen untuk .NET dan UWP