attribute
カスタム属性を作成する。
[ attribute(
AllowOn,
AllowMultiple=boolean,
Inherited=boolean
) ]
パラメーター
AllowOn
カスタム属性を適用できる言語要素を指定します。 既定値はです System::AttributeTargets:: すべて (System:: AttributeTargets を参照してください。AllowMultiple
カスタム属性は構造体に繰り返し適用できるかどうかを指定します。 既定値は False です。Inherited
属性がサブクラスに継承するかどうかを示します。 コンパイラではこの機能を特別にサポートしていません ; これはこの情報を考慮する属性の使用 (リフレクションなど) のジョブがあります。 Inherited が True 場合この属性によって継承されます。 AllowMultiple が True した場合この属性は派生メンバーに蓄積 ; AllowMultiple が False の場合属性が適用されます (または置換) をオーバーライドします。 Inherited が False した場合この属性は継承されません。 既定値は True です。
解説
注意
attribute の属性は使用されていません。ユーザー定義の attirbutes を作成するには直接に共通言語ランタイム (CLR System.Attribute 属性を使用します。詳細については、「ユーザー定義の属性 (C++ コンポーネント拡張)」を参照してください。
マネージ クラスまたは構造体の定義に attribute の属性を設定して カスタム属性 を定義します。 カスタム属性クラスの名前はです。 次に例を示します。
[ attribute(Parameter) ]
public ref class MyAttr {};
関数パラメーターに適用できる MyAttr という属性を定義します。 クラスは属性を他のアセンブリで使用されている場合はパブリックである必要があります。
注意
名前空間の競合を回避するには属性名は 「 Attribute 」で暗黙的に exit; この例では属性の名前およびクラスは実際に MyAttrAttribute がMyAttr と MyAttrAttribute は交換して使用できます。
クラスのパブリック コンストラクターが属性の無名のパラメーターを定義します。 オーバーロードされたコンストラクターでは属性は次の方法で定義されたカスタム属性を指定するいくつかの方法を使用する :
// cpp_attr_ref_attribute.cpp
// compile with: /c /clr
using namespace System;
[ attribute(AttributeTargets::Class) ] // apply attribute to classes
public ref class MyAttr {
public:
MyAttr() {} // Constructor with no parameters
MyAttr(int arg1) {} // Constructor with one parameter
};
[MyAttr]
ref class ClassA {}; // Attribute with no parameters
[MyAttr(123)]
ref class ClassB {}; // Attribute with one parameter
クラスのパブリック データ メンバーとプロパティは属性を省略できる名前付きパラメーターです :
// cpp_attr_ref_attribute_2.cpp
// compile with: /c /clr
using namespace System;
[ attribute(AttributeTargets::Class) ]
ref class MyAttr {
public:
// Property Priority becomes attribute's named parameter Priority
property int Priority {
void set(int value) {}
int get() { return 0;}
}
// Data member Version becomes attribute's named parameter Version
int Version;
MyAttr() {} // constructor with no parameters
MyAttr(int arg1) {} // constructor with one parameter
};
[MyAttr(123, Version=2)]
ref class ClassC {};
使用可能な属性のパラメーターの一覧についてはカスタム属性 を参照してください。
属性ターゲットの詳細についてはユーザー定義の属性 (C++ コンポーネント拡張) を参照してください。
attribute の属性にカスタム属性は単一の使用または使ってかどうかを指定する AllowMultiple のパラメーターがあります (同じエンティティ内で複数回使用できます)。
// cpp_attr_ref_attribute_3.cpp
// compile with: /c /clr
using namespace System;
[ attribute(AttributeTargets::Class, AllowMultiple = true) ]
ref struct MyAttr {
MyAttr(){}
}; // MyAttr is a multiuse attribute
[MyAttr, MyAttr()]
ref class ClassA {};
カスタム属性クラスは #ctor から直接または間接的に派生しているメタデータの中で属性の定義を高速で簡単になります。 attribute の属性はシステムからの継承を意味します :: 属性ため明示派生は不要です :
[ attribute(Class) ]
ref class MyAttr
上記のコードは、次のコードと同じです。
[ attribute(Class) ]
ref class MyAttr : System::Attribute // OK, but redundant.
attributeAttributeUsageAttribute はなく AttributeAttribute のエイリアスです ; これにより属性の名前付け規則には例外です)。
必要条件
属性コンテキスト
対象 |
ref クラス ref の構造体 |
複数回の適用 |
X |
必要な属性 |
なし |
無効な属性 |
なし |
属性コンテキストの詳細については、「属性コンテキスト」を参照してください。
使用例
// cpp_attr_ref_attribute_4.cpp
// compile with: /c /clr
using namespace System;
[attribute(AttributeTargets::Class)]
ref struct ABC {
ABC(Type ^) {}
};
[ABC(String::typeid)] // typeid operator yields System::Type ^
ref class MyClass {};
Inherited の名前付き引数は基本クラスに適用されたカスタム属性の派生クラスでリフレクションに表示されるかどうかを指定します。
// cpp_attr_ref_attribute_5.cpp
// compile with: /clr
using namespace System;
using namespace System::Reflection;
[attribute( AttributeTargets::Method, Inherited=false )]
ref class BaseOnlyAttribute { };
[attribute( AttributeTargets::Method, Inherited=true )]
ref class DerivedTooAttribute { };
ref struct IBase {
public:
[BaseOnly, DerivedToo]
virtual void meth() {}
};
// Reflection on Derived::meth will show DerivedTooAttribute
// but not BaseOnlyAttribute.
ref class Derived : public IBase {
public:
virtual void meth() override {}
};
int main() {
IBase ^ pIB = gcnew Derived;
MemberInfo ^ pMI = pIB->GetType( )->GetMethod( "meth" );
array<Object ^> ^ pObjs = pMI->GetCustomAttributes( true );
Console::WriteLine( pObjs->Length ) ;
}