x:ClassModifier ディレクティブ
x:Class も提供される場合の XAML のコンパイル動作を変更します。 特に、Public アクセス レベル (既定レベル) を持つ部分 class を作成する代わりに、提供された x:Class が NotPublic アクセス レベルで作成されます。 この動作は、生成されるアセンブリでのクラスのアクセス レベルに影響を与えます。
XAML 属性の使用方法
<object x:Class="namespace.classname" x:ClassModifier="NotPublic">
...
</object>
XAML 値
NotPublic |
TypeAttributes.Public か TypeAttributes.NotPublic かを指定するために渡す正確な文字列は、分離コードで使用されているプログラミング言語によって異なります。 「解説」を参照してください。 |
依存関係
x:Class も同じ要素に提供される必要があり、その要素はページのルート要素である必要があります。 詳細については、「[MS-XAML] 第 4.3.1.8 節」を参照してください。
解説
.NET Framework XAML サービスの使用での x:ClassModifier の値は、プログラミング言語によって異なります。 使用する文字列は、各言語の CodeDomProvider の実装方法、その言語が TypeAttributes.Public と TypeAttributes.NotPublic の意味を定義するために返す型コンバーター、およびその言語が大文字と小文字を区別するかどうかによって決まります。
C# の場合、TypeAttributes.NotPublic を指定するために渡す文字列は internal です。
Microsoft Visual Basic .NET の場合、TypeAttributes.NotPublic を指定するために渡す文字列は Friend です。
C++/CLI の場合、XAML のコンパイルをサポートする既存のターゲットは存在しないため、渡す値は指定されていません。
TypeAttributes.Public (C# では public、Visual Basic では Public) を指定することもできますが、TypeAttributes.Public が既定の動作となっているため TypeAttributes.Public を指定するのは一般的ではありません。
C# の private など、同等のユーザー コード アクセス レベル制限を持つ他の値は、x:ClassModifier として有効ではありません。XAML では入れ子になったクラス参照がサポートされないためであり、TypeAttributes.NotPublic 修飾子が同じ効果を持ちます。
セキュリティに関するメモ
x:ClassModifier で定義されているアクセス レベルは、特定のフレームワークとその機能によって解釈されます。 WPF には、対象のクラスが Pack URI 参照によって WPF リソースから参照される場合に、x:ClassModifier が internal である型を読み込んでインスタンス化する機能が用意されています。 このケースおよび他のフレームワークによって実装される同様のケースを踏まえて、可能性のあるすべてのインスタンス化をブロックするために x:ClassModifier だけに依存しないでください。