.NET Enumeration继承替代方案

时间:2011-07-11 11:07:51

标签: .net inheritance pinvoke enumeration

我想为ACCESS_MASK创建一个枚举,我必须使用 P / Invoke ,但我不知道这种实现的最佳方法是什么。< / p>

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。拆分并取自基本: (特定枚举对基本值本身一无所知)

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

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

您更喜欢哪个选项,还是有更好的ACCESS_MASK实施方式?

顺便说一句:什么是0x100001文件访问?

编辑:我知道没有枚举继承,ACCESS_MASK : uint就是这样,但假想的PROCESS_ACCESS_MASK : ACCESS_MASK就是。

2 个答案:

答案 0 :(得分:2)

假设您正在隐藏应用程序其余部分的P / Invoke详细信息,并且ACCESS_MASK值仅在本地使用,我只是将所有选项放入一个枚举中 - 您的选项2

此外,我会使用FlagsAttribute标记枚举,以表明它被视为位字段。

答案 1 :(得分: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的{​​{1}}类。