共用体ビュー クラスの作成

共用体ビュー クラスは、ソース クラス インスタンスの論理共用体です。 ソース クエリに WHERE 句を含めることでインスタンスを制限しない限り、共用体ビュー クラスにはソース クラスのすべてのインスタンスが含まれます。

共用体ビュー クラスは、異なる名前空間または異なるコンピューターに配置されている類似または同一のクラスのインスタンスを表示する場合に便利です。 たとえば、監視するさまざまなディスク ドライブのインスタンスを含む共用体クラスを作成できます。

また、共用体ビュー クラスのプロパティは、すべてのソース クラス インスタンスに存在しないプロパティに基づいて作成することもできます。 ソース クラス インスタンスに同じプロパティがない場合、共用体クラス インスタンスのプロパティの値は NULL になります。 たとえば、1 つのハード ディスク ドライブに 温度 プロパティがあり、別のハード ディスク ドライブに温度プロパティがない場合でも、2 つの間に共用体を作成できます。

以下の手順では、共用体ビュー クラスを作成する方法について説明します。

共用体ビュー クラスを作成するには

  1. Union 文字列修飾子を使用してクラス定義を開始します。

    JoinOnAssociationUnion の各修飾子は相互に排他的です。

  2. ViewSources 修飾子を使用して、ビュー クラスで使用するソース クラスを定義するクエリを作成します。

  3. ViewSpaces 修飾子を使用して、ソース クラスが配置されている名前空間の名前と場所を定義します。

  4. PropertySources 修飾子を使用して、ソース クラスのプロパティにマップするプロパティを定義します。

    必要に応じて、HiddenDefault 修飾子を使用して、ソース クラスに属することを示すタグをいずれかのプロパティに付けることができます。

  5. 共用体ビュー クラスのソース クラスのキー プロパティを定義します。

    各ソース クラスには、CIMType で一致する同じ数のキー プロパティが必要です。 また、共用体ビュー クラスのキーは、すべてのソース インスタンスを一意に識別する必要があります。 場合によっては、インスタンスが一意になるようにシステム プロパティを指定する必要があります。 たとえば、2 つの異なる名前空間の 2 つの同一クラスの共用体からビューを作成する場合は、ビュー クラスにキーとして __Namespace プロパティを含めることで、2 つのインスタンスを区別できます。 同じ名前空間の 2 つの同様のクラスを使用してビューを作成する場合は、__Class プロパティを使用して 2 つのクラスを区別できます。 ビュー クラスのシステム プロパティとの競合を回避できるように、ビュー内のシステム プロパティの名前を変更します。

  6. MethodSource 修飾子を使用して、必要なメソッドを定義します。

    他のビュー クラスとは異なり、共用体ビューを変更するメソッドを作成できます。

次のコード例では、共用体ビュー クラスについて説明します。

[Union, ViewSources{"SELECT Description, DeviceID, __Namespace, FileSystem, FreeSpace, VolumeName FROM LocalDisk", 
    "SELECT Description, DeviceID, __Namespace, FileSystem, FreeSpace, VolumeName FROM RemoteDisk"}, 
    ViewSpaces{"\\\\.\\Root\\LocalNamespace","\\\\.\\Root\\RemoteNamespace"}, 
    dynamic: ToInstance, provider("MS_VIEW_INSTANCE_PROVIDER")]

class UnionOfDrives

{
    [PropertySources{"Description", "Description"}] string des;
    [PropertySources{"DeviceID", "DeviceID"}, key] String did;
    [PropertySources{"__Namespace", "__Namespace"}, key] String KEYID;
    [PropertySources{"FileSystem", "FileSystem"}] String fsystem ;
    [PropertySources{"FreeSpace", "FreeSpace"}] uint64 fspace;
    [PropertySources{"VolumeName", "VolumeName"}] String vname;
};