.NET 枚举继承替代方案

发布于 2024-11-19 10:30:02 字数 1754 浏览 0 评论 0原文

我想为 ACCESS_MASK 我必须与P/Invoke一起使用,但我不知道这种实现的最佳方法是什么。

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 会是这样。

I'd like to create an enumeration for ACCESS_MASK i have to use with P/Invoke, but i do not know what would be the best way for such an inplementation.

1. If it were possible:

[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. Everything in one: (No automatic string representation possible)

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

3. Split and rewrite: (Muuuuch duplicate code)

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

4. Split and take from basic: (Specific enum doesn't know anything about the basic values itself)

[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,
}

Which option do you prefer, or are there any better ways for an ACCESS_MASK implementation?

Btw: whats a 0x100001 file access?

Edit: I know there is no enumeration inheritance and ACCESS_MASK : uint is nothing like that, but the imaginary PROCESS_ACCESS_MASK : ACCESS_MASK would be.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

孤檠 2024-11-26 10:30:02

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

此外,我会用 FlagsAttribute 表示将其视为位字段。

Assuming that you are hiding the P/Invoke details from the rest of the application, and that the ACCESS_MASK values are only used very locally, I'd just put all options into one single enum - your option 2.

Additionally, I'd mark the enum with FlagsAttribute to indicate that it is treated as a bit field.

嘿看小鸭子会跑 2024-11-26 10:30:02

您可以做什么:

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 如何在单独的静态类中定义具有特定 ColorsColor 类的启发。

What you can do:

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;
}

This way you keep the enum in the preferred form. This was inspired on on how Winforms defines the Color class with specific Colors in a separate static class.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文