Aracılığıyla paylaş


Kullanıcı Tanımlı Öznitelikler (C++ Bileşen Uzantıları)

Özel öznitelikler meta verileri bir arabirim, sınıf veya yapı, yöntemi, parametre veya numaralandırma genişletmenizi sağlar.

Tüm çalışma zamanları

Tüm çalışma zamanları özel öznitelikleri desteklemiyor.

Windows Çalışma Zamanı

C + +/ cx öznitelikler yalnızca özelliklerini destekler, ancak özniteliği kurucular ya da yöntemler değil.

yd21828z.collapse_all(tr-tr,VS.110).gifGereksinimler

Derleyici seçeneği:/ZW

Ortak dil çalışma zamanı

Özel öznitelikler yönetilen öğenin meta verileri metinlere kadar genişletmenize izin.Daha fazla bilgi için bkz. Öznitelikleri kullanarak meta verileri genişletme.

yd21828z.collapse_all(tr-tr,VS.110).gifNotlar

Bu konuda gösterilen sözdizimi ve bilgi yerini de sunulan bilgiler geliyordu özniteliği.

Özel bir öznitelik türü tanımlama ve yaparak tanımlamak Attribute bir temel sınıf türü ve isteğe bağlı olarak uygulama AttributeUsageAttribute özniteliği.

Örneğin, içinde Microsoft Transaction Server (mts) 1.0, eşitleme işlemleri ile ilgili davranışı Yük Dengeleme ve benzeri odl özel öznitelik kullanarak tür kitaplığına eklediğiniz özel GUID'leri ile belirtildi.Bu yüzden, mts sunucusunun istemcisi tür kitaplığını okuyarak karakteristiklerini belirleyebilir..net Framework tür kitaplığı analog meta verileri ve analog odl özel öznitelik özel öznitelikleri.Ayrıca, tür kitaplığı okunurken yansıma türlerini kullanmaya benzerdir.

Daha fazla bilgi için bkz:

Visual C++'ta imza derlemeler hakkında daha fazla bilgi için bkz: Kesin ad derlemeler (derleme imzalama) (C++/ CLI).

yd21828z.collapse_all(tr-tr,VS.110).gifGereksinimler

Derleyici seçeneği:/clr

yd21828z.collapse_all(tr-tr,VS.110).gifÖrnekler

Örnek

Aşağıdaki örnek, özel bir öznitelik tanımlamak gösterilmiştir.

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

Örnek

Bazı önemli özellikleri özel öznitelikler, aşağıdaki örnekte gösterilmektedir.Örneğin, bir ortak kullanım özel özniteliklerin Bu örnek gösterir: kendini istemciye tam olarak açıklayan bir sunucu örneği.

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

Çıktı

  
  
  
  
  
  

Örnek

Nesne ^ VARIANT veri türü türünü değiştirir.Aşağıdaki örnek, bir dizi nesnesinin özel bir öznitelik tanımlar ^ parametre olarak.

Öznitelik bağımsız değişkenleri, derleme zamanı sabitleri olması gerekir; Çoğu durumda, sabit hazır olmalıdır.

Bkz: typeid (C++ Bileşen Uzantıları) System::Type değeri özel öznitelik bloğundan dönüş konusunda bilgi.

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

Örnek

Çalışma zamanı özel öznitelik sınıfı ortak parçasını seri hale getirilebilir olması gerekir.Özel öznitelikleri yazarken kendi özel öznitelik adlandırılmış bağımsız değişkenleri ile derleme zamanı sabitleri sınırlıdır.(Bunu meta sınıfı düzeninizi eklenen 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.

Kavramlar

Çalışma platformları için bileşen uzantıları