2011-07-11 115 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.在一个一切:(没有自动字符串表示可能的)

[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值仅用于非常局部,我只是把所有的选项到一个单一的枚举 - 你的选择2.

此外,我会标记与FlagsAttribute enum来表明它被视为一个位字段。

+0

呃,当然忘记了'FlagsAttribute'。我目前正在使用第二个选项,但是我的应用程序需要的东西如下所示:_“给我访问掩码,我会告诉你你正在使用哪些权利组件。”_ – 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的启发。