attribute
カスタム属性を作成できます。
[ attribute(
AllowOn,
AllowMultiple=boolean,
Inherited=boolean
) ]
パラメータ
AllowOn
カスタム属性を適用する言語要素を指定します。既定値は System::AttributeTargets::All です (「AttributeTargets 列挙」を参照)。AllowMultiple
カスタム属性をコンストラクトに繰り返し適用できるかどうかを指定します。既定値は FALSE です。Inherited
サブクラスが属性を継承するかどうかを指定します。コンパイラはこの機能をサポートしていません。属性コンシューマ (リフレクションなど) がこの情報を処理します。Inherited が TRUE の場合、属性は継承されます。AllowMultiple が TRUE の場合、属性は派生メンバに繰り返し適用されます。AllowMultiple が FALSE の場合、属性は継承先でオーバーライド (または置換) されます。Inherited が FALSE の場合、属性は継承されません。既定値は TRUE です。
解説
メモ : |
---|
attribute 属性は現在、使用を推奨されていません。共通言語ランタイム属性 System.Attribute を使用し、ユーザー定義属性を直接作成できます。詳細については、「User-Defined Attributes」を参照してください。 |
カスタム属性を定義するには、マネージ クラスまたは struct 定義で attribute 属性を指定します。クラスの名前がカスタム属性になります。次に例を示します。
[ attribute(Parameter) ]
public ref class MyAttr {};
これによって、関数パラメータに適用できる MyAttr という属性が定義されます。属性をほかのアセンブリで使用する場合は、クラスをパブリックにします。
メモ : |
---|
名前空間の競合を防ぐため、すべての属性名の最後には暗黙で "Attribute" が付加されます。この例では、属性名とクラス名は実際には 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 {};
指定できる属性パラメータの型については、「カスタム属性」を参照してください。
属性のターゲットについては、「User-Defined Attributes」を参照してください。
attribute 属性は、カスタム属性を単独使用するか複数使用するかを指定する AllowMultiple パラメータを持ちます。複数使用とは、同じエンティティで 2 回以上使用することを意味します。
// 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 {};
カスタム属性のクラスは、AttributeCollection から直接または間接的に派生します。このため、メタデータ内での属性定義を簡単に識別できます。attribute 属性は System::Attribute からの継承を暗黙に定義するため、明示的な派生は不要です。
[ attribute(Class) ]
ref class MyAttr
これは、次と同じ意味になります。
[ attribute(Class) ]
ref class MyAttr : System::Attribute // OK, but redundant.
attribute は、AttributeAttribute ではなく System.AttributeUsageAttribute のエイリアスです。これは、属性の名前付け規則の例外です。
必要条件
属性コンテキスト
対象 |
ref class、ref struct |
複数回の適用 |
不可 |
必要な属性 |
なし |
無効な属性 |
なし |
属性コンテキストの詳細については、「属性コンテキスト」を参照してください。
使用例
// 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 {};
もう 1 つの名前付き引数 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 ) ;
}
2