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.
Gereksinimler
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.
Notlar
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).
Gereksinimler
Derleyici seçeneği:/clr
Ö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 {};