Aracılığıyla paylaş


Kullanıcı Tanımlı Öznitelikler (C++/CLI ve C++/CX)

C++/CLI ve C++/CX, bir arabirim, sınıf veya yapı, yöntem, parametre veya numaralandırmanın meta verilerini genişleten platforma özgü öznitelikler oluşturmanıza olanak tanır. Bu öznitelikler standart C++ özniteliklerinden farklıdır.

Windows Çalışma Zamanı

C++/CX özniteliklerini özelliklere uygulayabilirsiniz, ancak oluşturuculara veya yöntemlere uygulayamayın.

Gereksinimler

Derleyici seçeneği: /ZW

Ortak Dil Çalışma Zamanı

Bu konuda sunulan bilgiler ve söz dizimi, özniteliğinde sunulan bilgilerin yerini almak içindir.

Bir tür tanımlayıp türü için bir temel sınıf oluşturup Attribute isteğe bağlı olarak özniteliği uygulayarak AttributeUsageAttribute özel bir öznitelik tanımlayabilirsiniz.

Daha fazla bilgi için bkz.

Visual C++'da derlemeleri imzalama hakkında bilgi için bkz . Tanımlayıcı Ad Derlemeleri (Derleme İmzalama) (C++/CLI).

Gereksinimler

Derleyici seçeneği: /clr

Örnekler

Aşağıdaki örnekte özel özniteliğin nasıl tanımlanacağı gösterilmektedir.

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

Aşağıdaki örnekte özel özniteliklerin bazı önemli özellikleri gösterilmektedir. Örneğin, bu örnekte özel özniteliklerin ortak kullanımı gösterilmektedir: kendisini istemcilere tam olarak açıkleyebilecek bir sunucu örneği oluşturma.

// 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

Türü, Object^ değişken veri türünün yerini alır. Aşağıdaki örnek, bir dizisini Object^ parametre olarak alan özel bir özniteliği tanımlar.

Öznitelik bağımsız değişkenleri derleme zamanı sabitleri olmalıdır; çoğu durumda sabit değişmez değerler olmalıdır.

Özel öznitelik bloğundan System::Type değerini döndürme hakkında bilgi için bkz . typeid .

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

Çalışma zamanı, özel öznitelik sınıfının ortak bölümünün serileştirilebilir olmasını gerektirir. Özel öznitelikler yazarken, özel özniteliğinizin adlandırılmış bağımsız değişkenleri derleme zamanı sabitleriyle sınırlıdır. (Bunu, meta verilerde sınıf düzeninize eklenmiş bir bit dizisi olarak düşünün.)

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

Ayrıca bkz.

.NET ve UWP İçin Bileşen Uzantıları