.NET 枚举继承替代方案
我想为 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技术交流群](/public/img/jiaqun_03.jpg)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
假设您对应用程序的其余部分隐藏 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.您可以做什么:
这样您就可以将枚举保持为首选形式。这受到 Winforms 如何在单独的静态类中定义具有特定
Colors
的Color
类的启发。What you can do:
This way you keep the enum in the preferred form. This was inspired on on how Winforms defines the
Color
class with specificColors
in a separate static class.