2011-07-11 14 views
2

ACCESS_MASKの列挙を作成したいと思います。と一緒に使用する必要があります。P/Invokeしかし、このようなインプリメンテーションのための最良の方法は何かわかりません。.NET列挙継承代替

1.それが可能であった場合:

[Flags] 
enum ACCESS_MASK : uint 
{ 
    STANDARD_RIGHTS_REQUIRED = 0x000F0000, 
    SYNCHRONIZE = 0x00100000, 
    // Everything reused in the specific rights ... 
} 

[Flags] 
enum PROCESS_ACCESS_MASK : ACCESS_MASK 
{ 
    // ... 
    PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF, 
} 

2. 1でのすべて:(可能性はありません自動文字列表現)

[Flags] 
enum ACCESS_MASK : uint 
{ 
    STANDARD_RIGHTS_REQUIRED = 0x000F0000, 
    SYNCHRONIZE = 0x00100000, 
    // ... 
    PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF, 
} 

3分割および書き換え:(Muuuuch複製コード)

[Flags] 
enum PROCESS_ACCESS_MASK : uint 
{ 
    STANDARD_RIGHTS_REQUIRED = 0x000F0000, 
    SYNCHRONIZE = 0x00100000, 
    // ... 
    PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF, 
} 

4分割し、基本から取る:あなたが好む、または存在しないオプション(具体的な列挙型は基本的な価値観そのものについては何も知らない)

​​

ACCESS_MASK実装のためのより良い方法はありますか?

Btw:0x100001ファイルアクセス?

編集:私は、列挙の継承はありません知っているとACCESS_MASK : uintはそのようなものではありませんが、架空のPROCESS_ACCESS_MASK : ACCESS_MASKは次のようになります。

答えて

2

あなたがアプリケーションの残りの部分から詳細を起動/ Pを隠していること、およびACCESS_MASK値は非常にローカルに使用されていると仮定すると、私はちょうど1つの列挙にすべてのオプションを入れたい - あなたのオプション2.

さらに、ビットフィールドとして扱われることを示すために、enumをFlagsAttributeとマークします。あなたは何ができるか

+0

ええと、もちろん 'FlagsAttribute'を忘れてしまいました。私は現在その2番目のオプションを使用していますが、悲しいことに私のアプリケーションには次のようなものが必要です。_ "アクセスマスクを与えて、使用している権利コンポーネントを教えてくれます。" _ – ordag

+0

コンテキストでコードを見ることなく、 ;しかし、矛盾する定義を持つビットがない限り、私はすべての定義の和集合で作業します。もちろん、これはまた、あなたが(* "アクセスマスクを与えて、コンポーネントを教えてくれます - あなたのオブジェクトのタイプには有効です")、検証する必要がある場合に変更されます。 –

+0

喜んで妥当性検査はありません。私は異なる種類のハンドル(型を知っています)_とそのACCESS_MASKを取得し、それらがどのように開かれているかを述べなければなりません。問題は、例えば、 'PROCESS_TERMINATE'は' FILE_READ_DATA'_と同じ値を持っています(さらに、キー、スレッド、イベント、トークンなど多くの型があります...)_ – ordag

0

:あなたは好ましい形で列挙型を保つ

public enum ACCESS_MASK : uint 
{ 
    STANDARD_RIGHTS_REQUIRED = 0x000F0000, 
    SYNCHRONIZE = 0x00100000, 
    // Everything reused in the specific rights ... 
} 

public static class Masks 
{ 
    // ... 
    public const ACCESS_MASK PROCESS_ALL_ACCESS = ACCESS_MASK.STANDARD_RIGHTS_REQUIRED | ACCESS_MASK.SYNCHRONIZE | (ACCESS_MASK) 0xFFFF; 
} 

この方法です。これは、WinformsがColorクラスを特定のColorsの別の静的クラスに定義する方法に影響を受けました。