IEnumerable を実装するためのカスタム属性の適用
.NET Framework では、コレクションのオブジェクトを列挙するインターフェイスは、IEnumerable インターフェイスを継承する必要があります。 IEnumerable は、GetEnumerator という 1 つのメソッドを公開します。 アンマネージ COM ディスパッチ インターフェイスには、特別な DISPID (-4) を持つメンバー (DISPID_NEWENUM) が含まれており、インターフェイスが列挙できることを示します。 インポート時に、カスタム属性はアンマネージ COM インターフェイスに IEnumerable の実装を強制します。 このカスタム属性の構文は次のとおりです。
GUID = B64784EB-D8D4-4d9b-9ACD-0E30806426F7
Value = anything
メモ |
---|
IEnumerable カスタム タイプ ライブラリ属性は、ディスパッチ専用インターフェイス (dispinterface) またはデュアル インターフェイスにのみ適用できます。IUnknown から派生したインターフェイスは、IEnumerable を継承できません。したがって、カスタム属性を IUnknown から派生したインターフェイスに適用する場合、タイプ ライブラリ インポーターはその属性を無視します。 |
例
次の例はインターフェイス定義言語 (IDL) で記述されており、IEnumerable カスタム タイプ ライブラリ属性を使用して、IMyClass に IEnumerable の継承を強制する例を示します。
[
object,
uuid(40E86021-CAD7-493B-BF09-43811D821BA7),
dual,
helpstring("IMyClass Interface"),
pointer_default(unique),
// Use the IEnumerable custom attribute.
custom(B64784EB-D8D4-4d9b-9ACD-0E30806426F7,"")
]
interface IMyClass : IDispatch
{
};
[
uuid(3ACBCEB2-9D52-46FA-97E0-063310CFD776),
helpstring("MyClass Class")
]
coclass MyClass
{
[default] interface IMyClass;
};
タイプ ライブラリ インポート後の Microsoft Intermediate Language (MSIL) は、次のように表示されます。
.class interface public abstract auto ansi import IMyClass
implements [mscorlib]System.Collections.IEnumerable
{
...
} // This is the end of class MyClass.
一般的には、MSIL を調査した後でコードに IEnumerable が実装されていないことがわかった場合は、このカスタム属性を使用して強制的に実装できます。
参照
参照
概念
既定の COM ディスパッチ識別子 (DISPID) を上書きするためのカスタム属性の適用