Альтернативное наследование .NET - PullRequest
2 голосов
/ 11 июля 2011

Я хотел бы создать перечисление для 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 будет.

Ответы [ 2 ]

2 голосов
/ 11 июля 2011

Предполагая, что вы скрываете данные P / Invoke от остальной части приложения и что значения ACCESS_MASK используются только локально, я бы просто поместил все параметры в одно единственное перечисление - ваш вариант 2.

Кроме того, я бы пометил перечисление FlagsAttribute, чтобы указать, что оно обрабатывается как битовое поле.

0 голосов
/ 11 июля 2011

Что вы можете сделать:

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 в отдельном статическом классе.

...